簡體   English   中英

PHP + APACHE + LDAP + SSO:如何獲取當前用戶的MemberOf和DisplayName屬性?

[英]PHP + APACHE + LDAP + SSO: How to get the current user MemberOf and DisplayName attribute?

我有一個Web應用程序,當前要求用戶在登錄頁面中填寫用戶名和密碼。 我的想法是使用SSO來避免手動輸入這些信息。

經過幾個小時的修改httpd.conf文件,我可以使我的Web應用程序使用$_SERVER['PHP_AUTH_USER'];獲取當前Window的用戶名$_SERVER['PHP_AUTH_USER']; 命令。

不幸的是,為了比較應用程序內部的某些訪問,我還需要他當前所在的組。在這種情況下,它將是Active Directory memberOf屬性。

考慮到手動登錄將無法完成,如何獲得memberOf屬性? 我應該再次查詢用戶以獲取此信息還是有更好的方法?

順便說一句,我目前正在使用:

  • Apache版本2.4.33 x64
  • PHP版本7.2.4 x64
  • WAMPServer版本3.1.3 x64
  • Windows Server 2008 x64

只是為了比較,我用來檢索組和DisplayName屬性的當前代碼。 它運行良好,但是需要手動輸入用戶名和密碼:

public function Login($user, $pass, $remember = false){
    require_once("ad.class.php");   
    $ldap = new Ldap();
    $ret = $ldap->Bind($user, $pass);

    $redirect = RedirectURL($this->redirect);

    if ($ret){

        $filter = "(&(sAMAccountName=$user))";
        $attributes  = array("displayname","samaccountname","memberof");

        $info = $ldap->GetEntries($filter, $attributes);

        $aGrp = array();
        if (count($info) > 0){
            foreach ($info[0]['memberof'] as $member) {
                $aMember = explode(",", $member);
                $grp = str_replace("CN=\\", "", $aMember[0]);
                $grp = str_replace("CN=", "", $grp);
                $aGrp[] = $grp;
            }
        }

        if (!isset($_SESSION)) session_start();

        $_SESSION['session_login'] = array();
        $_SESSION['session_login']['user']  = $info[0]["samaccountname"][0];
        $_SESSION['session_login']['name']  = $info[0]["displayname"][0];
        $_SESSION['session_login']['grp']   = $aGrp;
        $_SESSION['lang']                   = getDefaultLanguage();

        if ($remember){
            $expire = (time() + (15 * 24 * 3600)); //15 dias

            setcookie('cookie_login', $_SESSION['session_login'], $expire);
        }

        accessLog(getCurrentUser(), 'Authorized - LDAP');               
        header("Location: index.php?redirect=" . $redirect);

        return true;
    }else{
        $ret['redirect'] = $redirect;
        $this->errors = $ret; //$this->redirect

        accessLog(getCurrentUser(), 'Access Denied - LDAP');
    }

    return false;
}

SSO不會使您(您的用戶)從身份驗證過程中解放出來,最終他們將不得不這樣做,但是看起來像這樣。

有幾種適用於各種SSO的庫,但是如果您想在Web環境中使用帶有HTTP POST綁定的SAML2來實現“真正的” SSO,則幾乎不會遇到simplesaml庫: https ://simplesamlphp.org/

我會建議您嘗試使用此庫來實施入侵……使用simplesaml,您將獲得功能齊全的行業標准SSO,可以輕松地與其他身份提供商(例如Windows上的ADFS)連接。

心連心

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM