php - session 和 LDAP

标签 php session ldap

我有一个网页。网页的身份验证由我设置的 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/

相关文章:

php - 使用 Symfony 1.4 的自动加载器加载命名空间类?

session - Symfony2 跨多个应用程序共享用户

java - 如何指定jdbc/DataSource?

java - LDAP:如何使用连接详细信息对用户进行身份验证

php - 我的网站 (PHP) 上的赌博应用程序出现问题

php - Kohana 中这个常数的意义何在?

php - 陷入 PHP 循环的中间

java - 如何测试org.hibernate.Session?

python - 在 sqlalchemy 中跨不同模块访问相同的 db.session

linux - 配置 svn 以使用 ldap 与 svn+ssh