LDAP身份验证与mysql 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

我有一个wierd问题,会话没有保存到全局变量,但它们正确地保存到了我的数据库。我有一个ldap auth脚本,可以设置会话并登录,但是当我刷新或转到另一个页面时,它会丢失变量,这让我发疯这里是减去ldap_auth.php的脚本

<?
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;
}