Symfony2: аутентификация с помощью активного каталога - PullRequest
2 голосов
/ 22 марта 2012

Я пытаюсь создать провайдера пользователя, чтобы я мог проходить аутентификацию через сервер Active Directory.

Проблема в том, что, в отличие от большинства других серверов LDAP, Active Directory не позволяет извлекать пользователяатрибут пароля, даже зашифрованный.

Вот мой класс пользователя:

class LdapUser implements UserInterface
{
    private $username;
    private $first_name;
    private $last_name;
    private $password;
    private $salt;
    private $roles;

    public function __construct($username, $first_name, $last_name, $password, $salt, array $roles) {
        $this->username = $username;
        $this->first_name = $first_name;
        $this->last_name = $last_name;
        $this->password = $password;
        $this->salt = $salt;
        $this->roles = $roles;
    }

    ...

}

А вот мой метод loadUserByUsername (в моем классе UserProvider):

public function loadUserByUsername($username)
{

    $server = "my_ldap_server";
    $root_dn = "my_root_dn";
    $root_pw = "my_root_pw";

    $ds = ldap_connect($server);
    if ($ds) {

        ldap_bind($ds, $root_dn, $root_pw);
        $search = ldap_search($ds, "my_branch", "(sAMAccountName=".$username.")", array("sn", "givenName"));
        $info = ldap_get_entries($ds, $sr);

        if($info['count'] > 0) {
            $user = $info[0];
            return new LdapUser($username, $user['givenName'][0], $user['sn'][0], '???PASSWORD???', '???SALT???', array('ROLE_USER'));
        } else {
            throw new UsernameNotFoundException(sprintf('Username "%s" does not exist.', $username));
        }

        ldap_close($ds);
    } else {
        echo "Connexion au serveur LDAP impossible";
    }
}

Как видите, я не могу передать пароль своему классу LdapUser, поскольку он недоступен через Active Directory.

Однако, я думаю, что все еще возможно аутентифицировать пользователя, выполнивldap_bind($username, $password) с паролем, введенным пользователем в форму входа.Проблема в том, что я не могу понять, как получить доступ к этому паролю в моем LdapUserProvider классе.

Я пытался $_POST['password'], но получил неопределенную ошибку индекса ...

Любая помощьбудет приветствоваться:)

Ответы [ 3 ]

1 голос
/ 20 февраля 2013

Существует несколько пакетов аутентификации LDAP, готовых к использованию.

Как указано ниже, вы можете попробовать FR3D / LdapBundle , но для работы требуется FOSUserBundle. Вы также можете попробовать IMAG (BorisMorel / LdapBundle) , если вы не хотите (или не должны) использовать FOSUserBundle. BorisMorel использует php-ldap для работы, он не требует никаких дополнительных пакетов или каких-либо компонентов Zend.

Даже если вы не хотите их использовать, я бы посоветовал вам проверить реализацию BorisMorel для получения дополнительной информации. Код довольно прост для понимания, так как он очень прост.

0 голосов
/ 05 апреля 2012

Попробуйте FR3dLdapBundle

В ветке 2.0.x есть поддержка Active Directory, если вы устанавливаете Zend\Ldap компонент из Zend Framework 2

0 голосов
/ 23 марта 2012

Ваш код устанавливает состояние аутентификации соединения, передавая запрос на привязку.Этот код пытается найти запись, извлечь пароль из этой записи и затем связать как это отличительное имя?Если это так, даже если вы можете восстановить пароль, правильно настроенный сервер каталогов не разрешит передачу предварительно закодированного пароля.Пароли всегда должны передаваться в виде открытого текста по безопасному соединению (TLS или SSL), чтобы сервер мог выполнять проверку качества и истории паролей.Поэтому ваш код должен знать пароль в открытом виде заранее.Кроме того, LDAP-совместимый сервер может разрешить использование прокси-аутентификации для определенных записей.

см. Также

...