PHP+APACHE+LDAP+SSO:如何获取当前用户MemberOf和DisplayName属性?

PHP+APACHE+LDAP+SSO:如何获取当前用户MemberOf和DisplayName属性?,php,windows,apache,ldap,single-sign-on,Php,Windows,Apache,Ldap,Single Sign On,我有一个web应用程序,当前要求用户在登录页面中填写用户名和密码。我的想法是使用SSO来避免手动输入这些信息 在修改了几个小时的httpd.conf文件之后,我能够让我的web应用程序使用$u服务器['PHP_AUTH_USER']获取当前窗口的用户名;指挥部 不幸的是,为了比较应用程序内部的一些访问权限,我还需要他当前所在的组。在本例中,它将是Active Directory memberOf属性 考虑到不会进行手动登录,如何获取memberOf属性?我应该再次查询用户以获取此信息,还是有更好

我有一个web应用程序,当前要求用户在登录页面中填写用户名和密码。我的想法是使用SSO来避免手动输入这些信息

在修改了几个小时的httpd.conf文件之后,我能够让我的web应用程序使用$u服务器['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环境中使用真正的SSO,即使用HTTP POST绑定的SAML2,您很难使用simplesaml库:

我会推荐这个库而不是任何尝试,来实现一个hack。。。使用simplesaml,您可以获得功能齐全的行业标准SSO,它可以轻松地与其他身份提供程序(如Windows上的ADF)连接