我有一个登录页面,它在加载后显示登录对话框。登录对话框只是使用Ajax call
的JQuery
对话框。类似的东西:使用会话cookie生存期和登录过程进行处理。 PHP
$(function() {
var _width = $.browser.msie ? 316 : 'auto';
var loginDialog = $('#loginDialog');
loginDialog.dialog({
closeOnEscape: false,
open: function() {
$(this).parent().find('.ui-dialog-titlebar-close').hide();
},
resizable: false,
position: 'center',
stack: true,
draggable: false,
height: 'auto',
width: _width,
modal: true,
buttons: {
'submit': function() {
$.ajax({
type: 'post',
dataType: 'html',
url: '/ProjectName/Scripts/php/AccountController.php',
cache: false,
// async: false,
data: $('#loginForm').serialize(),
success: function(accessStatus) {
if(accessStatus === 'granted') {
loginDialog.dialog('close');
}
},
error: function(request, status, error) {
// handle it in a specific manner
alert(error);
}
});
}
}
});
所以如果没关系(在服务器端)我只是关闭对话框。
然后在AccountController.php
文件作为现在我有类似的东西:
<?php
session_start();
if(IsAjaxRequest()) {
if(isset($_REQUEST['username']) && isset($_REQUEST['password'])) {
require_once('LDAPHandler.php');
// credentials
$username = $_REQUEST['username'];
$password = $_REQUEST['password'];
// ... more parameters
// ... Fetch against AD
if(IsInAdminRole($username, $password)) {
// ... establishing mysql connection & setting connection options
// and then:
mysql_query(
'insert into accounts'.
'(login, sid) values({$username}, {session_id()})'.
'on duplicate key update sid=values(sid)'
);
// write response
echo 'granted';
}
}
}
?>
我想是存储sid
在数据库中的相关记录(Accounts table
)。是什么让我困惑:
- 至于如果用户成功登录服务器后,复制一些页面会使用相同的会话cookie我明白了吗?我对吗?除非浏览器关闭。
- 如何处理不同浏览器的情况?
- 我读过,无论我需要使用会话,我都必须在页面上调用
session_start()
。这不会给出sid
与登录时写入的不同吗? - 说如果我不想重复,我的意思是用户不应该多次访问相同的资源(同时),哪种方式是最好的处理呢?
- 另外我明白,我需要使用某种标志(可能在帐户表中的字段)来说用户是
active
,导致以其他方式,我将只存储最后的sid
。或者更好的解决方案是在会话关闭后从数据库中删除用户?
巨大的感谢!
出于好奇,你的'LDAPHandler.php'使用PHP的本地'ldap_bind()'? – Adi 2012-07-17 08:49:41
是的我正在使用本地ldap_bind();我还没有后悔) – lexeme 2012-07-17 08:51:34
是否可以共享“LDAPHandler.php”的代码? (特别是'ldap_bind()'附近的部分。在将个人信息排除在外之后,我一直在研究一些不好的练习案例,而且我非常好奇 – Adi 2012-07-17 08:53:07