Symfony 4 + LDAP

Я хочу настроить в приложении, разработанном под symfony 4, систему аутентификации с использованием компонента LDAP.

Я уже тестировал напрямую, и я смог в контроллере получить данные пользователя (ов), используя:

$ldap = Ldap::create('ext_ldap', array(
    'host' => 'my-server',
    'encryption' => 'none',
));
...

Но мне нужно использовать форму входа в систему с полем userPrincipalName и полем пароля.

вот код:

#service.yaml

parameters:
    ldap.host: XX.XX.XX.XX

services:
    #...

    App\Service\LdapConnection:
        arguments: ['%ldap.host%', '%ldap.domain%']

    Symfony\Component\Ldap\Ldap:
        arguments: ['@Symfony\Component\Ldap\Adapter\ExtLdap\Adapter']
    Symfony\Component\Ldap\Adapter\ExtLdap\Adapter:
        arguments:
            -   host: '%ldap.host%'
                port: 389
                encryption: none
                options:
                    protocol_version: 3
                    referrals: false

security:
    providers:
        #in_memory: { memory: ~ }
        my_ldap:
            ldap:
                service: Symfony\Component\Ldap\Ldap
                base_dn: dc=assoc,dc=org
                search_dn: cn=read-only-,dc=assoc,dc=org
                search_password: POeJKz1532
                default_roles: ROLE_USER
                uid_key: userPrincipalName
                filter: ({uid_key} = {username})
    firewalls:
        dev:
            pattern: ^/(_(profiler|wdt)|css|images|js)/
            security: false
        main:
            anonymous: ~
            form_login_ldap:
                provider:  my_ldap
                login_path: login
                check_path: login_check
                service: Symfony\Component\Ldap\Ldap
                dn_string: '{username}@assoc.org'
                query_string: '(&(sAMAccountName = {username})(DC=assoc,DC=org))'

    access_control:
        - { path: ^/login, roles: IS_AUTHENTICATED_ANONYMOUSLY }
        - { path: ^/, roles: IS_AUTHENTICATED_FULLY }

<form action = "{{ path('login') }}" method = "post">

    {% if error %}
        <div class = "alert alert-danger" role = "alert">{{ error.messageKey|trans(error.messageData, 'security') }}</div>
    {% endif %}

    <input type = "hidden" name = "_csrf_token" value = "{{ csrf_token('authenticate') }}">

    <label for = "username">Username</label>
    <input type = "email" id = "username" name = "_username" value = "{{ last_username }}" required autofocus>

    <label for = "password">Password</label>
    <input type = "password" id = "password" name = "_password" required>

    <button class = "btn btn-lg btn-primary btn-block" type = "submit">Sign in</button>

</form>

# SecurityController

    /**
     * @Route("/login", name = "login")
     */
    public function login(Request $request, AuthenticationUtils $authenticationUtils)
    {
        // get the login error if there is one
        $error = $authenticationUtils->getLastAuthenticationError();

        // last username entered by the user
        $lastUsername = $authenticationUtils->getLastUsername();

        return $this->render('security/login.html.twig', array(
            'last_username' => $lastUsername,
            'error'         => $error,
        ));
    }

Любая идея ?? Спасибо

Решение

main:
    anonymous: ~
    form_login_ldap:
        dn_string: '{username}'

В коде ветки формы входа теги ошибок «<div>» должны находиться за пределами тегов «<form>», иначе вы не увидите ошибок.

Alvin Bunk 07.07.2018 02:04

Не нужно перемещать его за пределы формы, я все равно получаю сообщение о недопустимых учетных данных. Я тестировал с теми же параметрами, используя ldap_search, и он работает очень хорошо. Я думаю, что у меня что-то не так в security.yaml.

Yssn 09.07.2018 08:48

В журнале: security.INFO: Ошибка аутентификации. {"исключение": "[объект] (Symfony \\ Component \\ Security \\ Core \\ Exception \\ BadCredentia‌ lsException (код: 0): неверные учетные данные. в / var / www / api / vendor / symfony / security / Core / Authentication / Pro‌vider / UserAuthentica‌tionProvider.php: 67, Symfony \\ Component \\ Security \\ Core \\ Exception \\ UsernameNotFo‌ undException (code: 0): User \ "только для чтения- @. org \ "не найдено.

Yssn 09.07.2018 09:01

Нашел решение: dn_string: '{username}'

Yssn 09.07.2018 10:25
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Symfony Station Communiqué - 17 февраля 2023 г
Symfony Station Communiqué - 17 февраля 2023 г
Это коммюнике первоначально появилось на Symfony Station , вашем источнике передовых новостей Symfony, PHP и кибербезопасности.
Управление ответами api для исключений на Symfony с помощью KernelEvents
Управление ответами api для исключений на Symfony с помощью KernelEvents
Много раз при создании api нам нужно возвращать клиентам разные ответы в зависимости от возникшего исключения.
1
4
2 967
0

Другие вопросы по теме