2012-05-11 12 views
3

私はウェブページを持っています。ウェブページへの認証は私が設定したLDAPサーバによって処理されます。今、私はセッションを実装することはできません。ユーザーが一定期間(10秒以下の場合)非アクティブになると、セッションは終了し、ユーザーはLDAPサーバーからバインドを解除します。このコードの抜粋が見つかりました:セッションとLDAP

<?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'ページにリダイレクトされます。

+0

10分でしたか? – gunnx

+0

No.10秒。それはテスト目的のためです。 – TheAptKid

答えて

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

    } 

} 
「にログイン」と言うだろう10秒の下で任意の時間をエコーし​​ます

保護されているすべてのページの上部にある上記の機能を呼び出すだけです。これにより、すべての認証プロセスが処理されます。ユーザーが認証されている場合はLDAP接続リソースが返され、そうでない場合はendSession.phpにリダイレクトされます。

ただ、各ページの上部に次の行を配置します。

$ds = check_auth_ldap(); 

...と機能はあなたのためのすべての取材を行います。

+0

したがって、POST変数はLDAPフォームから来ます。 – TheAptKid

+0

申し訳ありませんが、質問でそれを説明するのを忘れてしまった:POST変数はログインフォームから来るので、ログインフォームは '

'。 'logout'のGETパラメータを渡すことでログアウトすることができます - 値が何であってもキーが設定されているだけで – DaveRandom

0

私は書かれて(とテスト)しました。この:

test.phpを

<?php 
session_start(); 

if(isset($_GET['start'])) 
    $_SESSION['start'] = time(); 

if(time() - $_SESSION['start'] > 10) 
    echo 'Logged out'; 
else 
    echo 'Logged in'; 

?> 

ブラウザでtest.php?startに行けば、それは行く、その後、 "ログイン中" と言うだろうお使いのブラウザでtest.phpと10秒後の任意の時間に、それは、「アウトログイン」それは

1

多くの場合、uidに基づいてバインドする必要があります。私はこれを達成するために少し機能を変更しました。バインドのためのcnは、ユーザー名のuidに基づく検索操作に由来します。これが誰かを助けてくれることを願って

function check_auth_ldap() { 

    if (!($_POST['username'] && $_POST['password'])) { 

    header("Location: login.php?failure=6"); 

    } 

    $sessionTimeoutSecs = 10; 
    $ldapServer = localhost; 
    $ldapBaseDN = ou=users,ou=subtree,dc=domain,dc=tld; 
    $ldapPort = 389; 
    $ldapFilter = "(&(objectClass=*)(uid=".$_POST['username']."))"; 
    $ldapAttributes = array("cn"); 

    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); 
    $sr = ldap_search($ds,$ldapBaseDN,$ldapFilter,$ldapAttributes); 
    $result = ldap_get_entries($ds, $sr); 

    if ($result) { 
     $binddn = $result[0]['dn']; 
    } else { 
     header("Location: login.php?failure=1"); 
    } 

    ldap_close ($ds); 

    $ds = ldap_connect($ldapServer, $ldapPort); 
    ldap_set_option($ds, LDAP_OPT_PROTOCOL_VERSION, 3); 

    if (ldap_bind($ds, $binddn, $_SESSION['password'])) { 
     $_SESSION['lastactivity'] = time(); 
     return $ds; 
    } else { 
     unset($_SESSION['lastactivity'], $_SESSION['username'], $_SESSION['password']); 
     header("Location: login.php?failure=2"); 
     exit; 
    } 

    } else if (isset($_POST['username'], $_POST['password'])) { 

    // Handle login requests 
    $ds = ldap_connect($ldapServer, $ldapPort); 
    $sr = ldap_search($ds,$ldapBaseDN,$ldapFilter,$ldapAttributes); 
    $result = ldap_get_entries($ds, $sr); 

    if ($result) { 
     $binddn = $result[0]['dn']; 
    } else { 
     header("Location: login.php?failure=3"); 
    } 
    ldap_close ($ds); 

    $ds = ldap_connect($ldapServer, $ldapPort); 
    ldap_set_option($ds, LDAP_OPT_PROTOCOL_VERSION, 3); 

    if (ldap_bind($ds, $binddn, $_POST['password'])) { 
     // Successful auth 
     $_SESSION['lastactivity'] = time(); 
     $_SESSION['username'] = $_POST['username']; 
     $_SESSION['password'] = $_POST['password']; 
     return $ds; 
    } else { 
     // Auth failed 
     header("Location: login.php?failure=4"); 
     exit; 
    } 

    } else { 

    // Session has expired or a logout was requested 
    unset($_SESSION['lastactivity'], $_SESSION['username'], $_SESSION['password']); 
    header("Location: login.php?failure=5"); 
    exit; 

    } 

} 
関連する問題