Аутентификация LDAP с Symfony 2.8

Я пытаюсь использовать новый LdapUserProvider в Symfony 2.8. Кажется, я настроил все согласно документации.

Мой пользователь может успешно пройти аутентификацию, а затем будет перенаправлен на защищенную страницу. После перенаправления начинается проблема. Symfony пытается подключиться как аутентифицированный пользователь, но с нулевым паролем, который отклоняется открытым ldap.

Вот соответствующие записи журнала и значения конфигурации.

Конфигурация:

services:
    app.ldap:
        class: Symfony\Component\Ldap\LdapClient
        arguments: [ "localhost" ]

Безопасность:

security:
    firewalls:
        restricted_area:
            provider: app_users
            form_login_ldap:
                service: app.ldap
                dn_string: "uid={username},DC=mydomain,DC=net"
                check_path: login_check
                login_path: login
    providers:
        app_users:
            ldap:
                service: app.ldap
                base_dn: dc=mydomain,dc=net
                search_dn: cn=Manager,DC=mydomain,DC=net
                search_password: secretPassword
                filter: "(&(aptAccountEnabled=1)(ObjectClass=aptAccount)(uid={username}))"
                default_roles: ROLE_USER

И файл журнала:

[2015-12-18 13:55:11] request.INFO: Matched route "login_check". {"route_parameters":{"_route":"login_check"},"request_uri":"http://ancdev.admin.aptalaska.net/~dmorphis/Portal/web/app_dev.php/Login/Verify"} []
[2015-12-18 13:55:11] security.DEBUG: Read existing security token from the session. {"key":"_security_restricted_area"} []
[2015-12-18 13:55:11] security.DEBUG: User was reloaded from a user provider. {"username":"dan.smartrg","provider":"Symfony\\Component\\Security\\Core\\User\\LdapUserProvider"} []
[2015-12-18 13:55:26] security.INFO: User has been authenticated successfully. {"username":"dan.smartrg"} []
<snip>
[2015-12-18 13:55:26] security.DEBUG: Stored the security token in the session. {"key":"_security_restricted_area"} []
<snip>
[2015-12-18 13:55:27] request.INFO: Matched route "home.index". {"route_parameters":{"_controller":"Apt\\PortalBundle\\Controller\\DefaultController::indexAction","_route":"home.index"},"request_uri":"http://ancdev.admin.aptalaska.net/~dmorphis/Portal/web/app_dev.php/"} []
[2015-12-18 13:55:28] security.DEBUG: Read existing security token from the session. {"key":"_security_restricted_area"} []
[2015-12-18 13:55:28] security.DEBUG: User was reloaded from a user provider. {"username":"dan.smartrg","provider":"Symfony\\Component\\Security\\Core\\User\\LdapUserProvider"} []
[2015-12-18 13:56:15] php.DEBUG: ldap_bind(): Unable to bind to server: Server is unwilling to perform {"type":2,"file":"/home/dmorphis/public_html/Portal/vendor/symfony/symfony/src/Symfony/Component/Ldap/LdapClient.php","line":73,"level":28928} []
[2015-12-18 13:56:15] app.ERROR: Bad credentials. [{"file":"/home/dmorphis/public_html/Portal/app/cache/dev/classes.php","line":2697,"function":"authenticate","class":"Symfony\\Component\\Security\\Core\\Authentication\\Provider\\UserAuthenticationProvide <truncated>
[2015-12-18 13:56:15] security.INFO: An AuthenticationException was thrown; redirecting to authentication entry point.

person Dan Morphis    schedule 18.12.2015    source источник
comment
Документы говорят использовать Symfony\Component\Security\Ldap\Ldap, но документы неверны. Фактический класс — Symfony\Component\Ldap\LdapClient.   -  person Dan Morphis    schedule 19.12.2015
comment
Это кажется довольно серьезным. Может быть, открыть вопрос на GitHub об этом? (там виднее)   -  person Radu Murzea    schedule 20.12.2015


Ответы (4)


Наконец я нашел, в чем была проблема.

Вы должны связать UserProvider:

chain_provider:
    chain:
             providers: [in_memory, app_users]
    in_memory:
        memory: ~
    app_users:
        ldap:
           .....</i>
person Adrian    schedule 04.02.2016
comment
добавление строки провайдеров выше дает мне ошибку на symfony 2.8 - person Christian; 02.05.2016
comment
разметка немного нарушена, здесь: symfony.com/doc/2.8/security/multiple_user_providers .html - person 4lxndr; 29.07.2016

У меня была такая же проблема. В моем случае это была неправильная конфигурация framework.session.handler_id — мне пришлось изменить его с собственного обработчика файлов на null, который является обработчиком сеанса PHP по умолчанию.

person cadavre    schedule 04.05.2016

У меня была почти точно такая же проблема. После интенсивной отладки я пришел к строке:

in \Symfony\Component\Security\Core\Authentication\Token\UsernamePasswordToken::__construct:

parent::setAuthenticated(count($roles) > 0);

Это было проблемой, потому что я диагностировал, что UsernamePasswordToken с самого начала поступал не прошедшим проверку подлинности из хранилища сеансов. Это было вызвано отсутствием назначенных ролей из-за моего пользовательского переопределения служб по умолчанию.

Обычно LDAP вызывается только один раз при входе в систему, и пароль не должен сохраняться в сеансе. Только authenticated = true в сериализованном токене.

Вы уверены, что получаете несериализованный аутентифицированный токен?

person TautrimasPajarskas    schedule 31.01.2016

В Symfony 3.1 компонент LdapClient устарел. Поэтому я хотел обновить решение. Это решение также должно работать для приложений Symfony 2.8/2.9.

#security.yml
security:
    firewalls:
        restricted_area:
            provider: app_users
            form_login_ldap:
                service: ldap.auth
                dn_string: "%dn_string%"

    providers:
        app_users:
            ldap:
                service: ldap.auth
                base_dn: "dc=domain,dc=net"
                search_dn: "cn=Manager,DC=domain,DC=net"
                search_password: secretPassword
                filter: "(&(aptAccountEnabled=1)(ObjectClass=aptAccount)({uid_key}={username}))"
                default_roles: ROLE_USER
                uid_key: uid

#services.yml
services:
    ldap.auth:
        class: 'Symfony\Component\Ldap\Ldap'
        factory:
            - 'Symfony\Component\Ldap\Ldap'
            - 'create'
        arguments:
            - 'ext_ldap'  # adapter
            -
              host: database
              options:
                  protocol_version: 3
person Dan Morphis    schedule 07.04.2017