PHP + APACHE + LDAP + SSO: Как получить атрибуты MemberOf и DisplayName текущего пользователя? - PullRequest
0 голосов
/ 25 июня 2019

У меня есть веб-приложение, которое в данный момент просит пользователя ввести имя пользователя и пароль на странице входа.Моя идея состоит в том, чтобы использовать SSO , чтобы избежать ручного ввода этой информации.

После нескольких часов изменения файла httpd.conf я смог сделать свой вебприложение получает имя пользователя текущего окна с помощью команды $_SERVER['PHP_AUTH_USER'];.

Для сравнения некоторого доступа внутри приложения, к сожалению, мне также нужны группы, в которых он находится в данный момент. В этом случае это будет Active DirectorymemberOf атрибут

Учитывая, что вход в систему вручную не будет, как я могу получить атрибут memberOf?Должен ли я снова запросить пользователя, чтобы получить эту информацию, или есть лучший подход?

Кстати, в настоящее время я использую:

  • Apache Version 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;
}

1 Ответ

1 голос
/ 25 июня 2019

Единый вход не освобождает вас (ваших пользователей) от процесса аутентификации, в конечном итоге им придется это сделать, однако это может выглядеть следующим образом.

Существует несколько библиотек, доступных для всех видов единого входа, но если вы хотите использовать «настоящий» единый вход в веб-среде, SAML2 с привязкой HTTP POST, вы вряд ли найдете библиотеку simplesaml: https://simplesamlphp.org/

Я бы порекомендовал эту библиотеку при любой попытке внедрить хак ... с simplesaml вы получаете полнофункциональный стандартный SSO, который можно легко подключать к другим поставщикам удостоверений, таким как ADFS в Windows.

НТН

...