我有一个网页。网页的身份验证由我设置的 ldap 服务器处理。现在我不想实现 session ,这样当用户在一段时间内(在下面的例子中是 10 秒)处于非事件状态时, session 将结束并且用户将与 ldap 服务器解除绑定(bind)。我找到了这段代码摘录:
<?php
session_cache_expire(20);
session_start();
$inactive = 10;
if(isset($_SESSION['start'])) {
$session_life = time() - $_SESSION['start'];
if($session_life > $inactive){
header("Location: endSession.php");
}
}
$_SESSION['start'] = time();
?>
它不起作用。如果我刷新页面,它会将我重定向到我的“endSession.php”页面,即使我处于事件状态也是如此。
最佳答案
function check_auth_ldap () {
$sessionTimeoutSecs = 10;
$ldapServer = '11.22.33.44';
$ldapPort = 389;
if (!isset($_SESSION)) session_start();
if (!empty($_SESSION['lastactivity']) && $_SESSION['lastactivity'] > time() - $sessionTimeoutSecs && !isset($_GET['logout'])) {
// Session is already authenticated
$ds = ldap_connect($ldapServer, $ldapPort);
if (ldap_bind($ds, $_SESSION['username'], $_SESSION['password'])) {
$_SESSION['lastactivity'] = time();
return $ds;
} else {
unset($_SESSION['lastactivity'], $_SESSION['username'], $_SESSION['password']);
header("Location: endSession.php");
exit;
}
} else if (isset($_POST['username'], $_POST['password'])) {
// Handle login requests
$ds = ldap_connect($ldapServer, $ldapPort);
if (ldap_bind($ds, $_POST['username'], $_POST['password'])) {
// Successful auth
$_SESSION['lastactivity'] = time();
$_SESSION['username'] = $_POST['username'];
$_SESSION['password'] = $_POST['password'];
return $ds;
} else {
// Auth failed
header("Location: endSession.php");
exit;
}
} else {
// Session has expired or a logout was requested
unset($_SESSION['lastactivity'], $_SESSION['username'], $_SESSION['password']);
header("Location: endSession.php");
exit;
}
}
只需在每个 protected 页面的顶部调用上述函数即可。这将处理所有身份验证过程。如果用户通过身份验证,它将返回 LDAP 连接资源,如果没有通过身份验证,它将把它们重定向到 endSession.php
。
只需将这一行放在每个页面的顶部:
$ds = check_auth_ldap();
...该函数将为您完成所有跑腿工作。
关于php - session 和 LDAP,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10549279/