LDAP身份验证与mysql php会话
我有一个wierd问题,会话没有保存到全局变量,但它们正确地保存到了我的数据库。我有一个ldap auth脚本,可以设置会话并登录,但是当我刷新或转到另一个页面时,它会丢失变量,这让我发疯这里是减去ldap_auth.php的脚本LDAP身份验证与mysql php会话,php,mysql,Php,Mysql,我有一个wierd问题,会话没有保存到全局变量,但它们正确地保存到了我的数据库。我有一个ldap auth脚本,可以设置会话并登录,但是当我刷新或转到另一个页面时,它会丢失变量,这让我发疯这里是减去ldap_auth.php的脚本 <? function sess_open($save_path, $session_name){ $_SERVER['SessionDB']->connect(); if ($_SERVER['SessionDB']-&g
<?
function sess_open($save_path, $session_name){
$_SERVER['SessionDB']->connect();
if ($_SERVER['SessionDB']->sess) return true;
else return false;
}
function sess_close(){
$_SERVER['SessionDB']->disconnect();
}
function sess_read($key){
global $SESS_LIFE;
$_SERVER['SessionDB']->Query('UPDATE Sessions SET Expiry="' . (time() + $SESS_LIFE) . '" WHERE SessionID="' . $key . '" AND Expiry >= "' . time() . '"');
$Value = $_SERVER['SessionDB']->oQuery('SELECT Value FROM Sessions WHERE SessionID = "' . $key . '" AND Expiry >= ' . time());
if ($Value) return $Value;
else return '';
}
function sess_write($key, $val){
global $SESS_LIFE;
$Expiry = time() + $SESS_LIFE;
$Value = addslashes($val);
if (!$qid = $_SERVER['SessionDB']->Query('INSERT INTO Sessions VALUES ("' . $key . '", ' . $Expiry . ', "' . $Value . '")'))
$qid = $_SERVER['SessionDB']->Query('UPDATE Sessions SET Expiry = ' . $Expiry . ', Value = "' . $Value . '" WHERE SessionID = "' . $key . '" AND Expiry > ' . time());
return $qid;
}
function sess_destroy($key){
return $_SERVER['SessionDB']->Query('DELETE FROM Sessions WHERE SessionID = "' . $key . '"');
}
function sess_gc($maxlifetime){
return $_SERVER['SessionDB']->Query('DELETE FROM Sessions WHERE Expiry < ' . time());
}
$SESS_LIFE = get_cfg_var("session.gc_maxlifetime");
ini_set("session.save_handler", "user");
session_set_save_handler("sess_open", "sess_close", "sess_read", "sess_write", "sess_destroy", "sess_gc");
// We want a seperate one in $_SERVER['SessionDB']
$_SERVER['SessionDB'] = new mysql_db();
// Set this information appropriately based on what's in
// our configuration file
$_SERVER['SessionDB']->Hostname = $config->dbHost;
$_SERVER['SessionDB']->Username = $config->dbUser;
$_SERVER['SessionDB']->Password = $config->dbPass;
$_SERVER['SessionDB']->Database = $config->dbName;
session_start();
foreach ($_SESSION as $key=>$value)
if (is_string($value))
$_SESSION[$key] = trim($value);
function murder_session(){
// session_destroy();
// unset($_SESSION);
}
?>
下面是ldap脚本
<?
function authenticate($user, $password) {
// Active Directory server
$ldap_host = "x.x.x.x";
// Active Directory DN
$ldap_dn = "Here is the long LDAP String";
// Domain, for purposes of constructing $user
$ldap_usr_dom = "@here.local";
// connect to active directory
$ldap = ldap_connect($ldap_host)
or die("Couldn't connect to LDAP Server");
$x = explode('.', $user);
$user = $x[0] . ' ' . $x[1];
$dn = "cn=".$user.",";
// verify user and password
if($bind = @ldap_bind($ldap, $dn . $ldap_dn, $password)) {
// valid
// check presence in groups
$filter = "(cn=" . $user . ")";
$attr = array("memberof");
$result = ldap_search($ldap, $ldap_dn, $filter, $attr) or exit("Unable to search LDAP server");
$entries = ldap_get_entries($ldap, $result);
ldap_unbind($ldap);
$_SESSION['user'] = $user;
// $_SESSION['access'] = $access;
$_SESSION['LoggedIn'] = true;
return true;
} else {
// invalid name or password
return false;
}
}
?>
这是因为您的LDAP/登录脚本在会话脚本和调用之前启动,也就是说,它获取LDAP值,将它们正确地保存到数据库中,您的登录工作正常,但是由于会话尚未启动,下一个请求会立即忘记放置在
$\u会话中的内容
或者,如果会话正常,您的会话(到不同的路径或域,或到期时间太短,或任何其他错误)但可能性较小。好的,所以我发现这是一种愚蠢的方式,当另一种方式对数据库中的users表适用时,我不得不这样做。因此,这里有一个旧的方法,可以用于用户表,但不能用于LDAP脚本
function sess_write($key, $val){
global $SESS_LIFE, $sess_db;
$Expiry = time() + $SESS_LIFE;
$Value = addslashes($val);
if (!$qid = $sess_db->Query('INSERT INTO Sessions VALUES ("' . $key . '", ' . $Expiry . ', "' . $Value . '")'))
$qid = $sess_db->Query('UPDATE Sessions SET Expiry = ' . $Expiry . ', Value = "' . $Value . '" WHERE SessionID = "' . $key . '"
AND Expiry > ' . time());
return $qid;
}
这是我写它的新方法
function sess_write($key, $val){
global $SESS_LIFE, $sess_db;
$Expiry = time() + $SESS_LIFE;
$Value = addslashes($val);
if (!$qid = $sess_db->rQuery('SELECT * FROM Sessions WHERE SessionID = "'.$key.'" AND Expiry >=' . time())) {
$sess_db->Query('INSERT INTO Sessions (SessionID,Expiry,Value) VALUES ("' . $key . '", ' . $Expiry . ', "' . $Value . '")');
} else {
$sess_db->Query('UPDATE Sessions SET Expiry = ' . $Expiry . ', Value = "' . $Value . '" WHERE SessionID = "' . $key . '"');
if ($sess_db->Error()) die($sess_db->Error());
}
return $qid;
}
我仍然不明白为什么一种方法可以很好地处理用户表,而另一种方法可以很好地处理这两种表 如果您使用的是$\u会话
,而不是$\u服务器
_服务器用于检索有关系统和服务器配置的信息。它不是一个你应该存储对象和/或任意数据的地方,它只是存储在$\u服务器中的$\u服务器['SessionDB']
。虽然这仍然是错误的和令人讨厌的,但这并不是问题的原因。不是这样,我编辑了最上面的帖子,向您展示了加载的顺序以及ldap脚本。好了,就是这样,我将它添加到了它为站点调用的第一个文件中,即包含文件,但是,我不知道为什么会出现这样的问题,因为在ldap脚本之前,我在数据库中有一个users表,它工作得很好。有什么想法吗?我不太确定在脚本结束后是否可以保持ldap连接。在任何情况下,您都试图在$\u服务器中存储内容,而不是在该服务器上存储任何内容$\u服务器
是一个超全局服务器,用于检索有关服务器、连接和PHP本身的信息,而不是用于存储任何内容。它需要持久化吗?一旦它保存到会话变量和数据库中,它应该检查会话id以确保用户仍然正确登录?我不这么认为。会话由服务器控制,如果您说$\u session['logged\u in']=true
,则当会话处于活动状态时,将设置$\u session['logged\u in']
,并且true
因此用户已登录。你通常不需要更进一步,除非你想测试并删除用户会话,如果他的帐户被删除或类似的事情。好吧,我实际上撒谎了,还有一个事实,我没有把SessionID作为主键。。。。noobie错误
function sess_write($key, $val){
global $SESS_LIFE, $sess_db;
$Expiry = time() + $SESS_LIFE;
$Value = addslashes($val);
if (!$qid = $sess_db->Query('INSERT INTO Sessions VALUES ("' . $key . '", ' . $Expiry . ', "' . $Value . '")'))
$qid = $sess_db->Query('UPDATE Sessions SET Expiry = ' . $Expiry . ', Value = "' . $Value . '" WHERE SessionID = "' . $key . '"
AND Expiry > ' . time());
return $qid;
}
function sess_write($key, $val){
global $SESS_LIFE, $sess_db;
$Expiry = time() + $SESS_LIFE;
$Value = addslashes($val);
if (!$qid = $sess_db->rQuery('SELECT * FROM Sessions WHERE SessionID = "'.$key.'" AND Expiry >=' . time())) {
$sess_db->Query('INSERT INTO Sessions (SessionID,Expiry,Value) VALUES ("' . $key . '", ' . $Expiry . ', "' . $Value . '")');
} else {
$sess_db->Query('UPDATE Sessions SET Expiry = ' . $Expiry . ', Value = "' . $Value . '" WHERE SessionID = "' . $key . '"');
if ($sess_db->Error()) die($sess_db->Error());
}
return $qid;
}