Аутентифікація з LDAP-сервером

Дата оновлення перекладу 2022-12-22

Аутентифікація з LDAP-сервером

Symfony надає різні способи роботи з LDAP-сервером.

Компонент Security пропонує:

  • Постачальника користувачів ldap, що використовує клас LdapUserProvider. Як і всі інші постачальники користувачів, він може бути використаний з будь-яким постачальником аутентифікації.
  • Постачальника аутентифікації form_login_ldap, для аутентифікації з LDAP-сервером, використовуючи форму входу. Як і всі інші постачальники аутентифікації, він може бути використаний з будь-яким постачальником користувачів.
  • Постачальника аутентифікації http_basic_ldap, для аутентифікації з LDAP-сервером, використовуючи Базовий HTTP. Як і всі інші постачальники аутентифікації, він може бути використаний з будь-яким постачальником користувачів.

Це означає, що наступні сценарії працюватимуть:

  • Перевірка пароля користувача та вилучення інформації користувача з LDAP-сервером. Це може бути зроблено з використанням як постачальника користувачів LDAP, так і з формою входу LDAP або постачальниками аутентифікації LDAP базового HTTP.
  • Перевірка пароля користувача з LDAP-сервером під час вилучення інформації з іншого джерела (БД, що використовує FOSUserBundle, наприклад).
  • Завантаження інформації користувача з LDAP-сервера під час використання іншої стратегії аутентифікації (наприклад, попередьної аутентифікації на засаді токену).

Установка

У додатках, що використовують Symfony Flex , виконайте цю команду, щоб встановити компонент Ldap, перед його використанням:

1
$ composer require symfony/ldap

Довідник Ldap-конфігурації

Дивіться Довідник конфігурації Security (SecurityBundle), щоб побачити повний довідник LDAP-конфігурації (form_login_ldap, http_basic_ldap, ldap). Деякі найцікавіші опції пояснюються нижче.

Конфігурація LDAP-клієнта

Всі механізми насправді потребують попередьно сконфігурованого LDAP-клієнта. Постачальники конфігуруються так, щоб за замовчуванням використовувати сервіс під назвою ldap, але ви можете перевизначити це налаштування у конфігурації компонента Security.

LDAP-клієнт може бути просто сконфігурований, використовуючи вбудоване PHP-розширення LDAP з наступним визначенням сервісу:

  • YAML
  • XML
  • PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
# config/services.yaml
services:
    Symfony\Component\Ldap\Ldap:
        arguments: ['@Symfony\Component\Ldap\Adapter\ExtLdap\Adapter']
        tags:
            - ldap
    Symfony\Component\Ldap\Adapter\ExtLdap\Adapter:
        arguments:
            -   host: my-server
                port: 389
                encryption: tls
                options:
                    protocol_version: 3
                    referrals: false

Вилучення користувачів з використанням постачальника користувачів LDAP

Якщо ви хочете вилучити інформацію користувача з LDAP-сервера, ви можете захотіти використати постачальника користувачів ldap.

  • YAML
  • XML
  • PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
# config/packages/security.yaml
security:
    # ...

    providers:
        my_ldap:
            ldap:
                service: Symfony\Component\Ldap\Ldap
                base_dn: dc=example,dc=com
                search_dn: "cn=read-only-admin,dc=example,dc=com"
                search_password: password
                default_roles: ROLE_USER
                uid_key: uid
                extra_fields: ['email']

Caution

Компонент Security екранує надані дані введення, коли використовується LDAP-користувач. Однак, компонент LDAP сам по собі поки не надає ніякого екранування. Тому, ваша задача - запобігти впровадженню LDAP-атак при використанні компонента напряму.

Caution

Користувач, сконфігурований вище у постачальнику користувачів, використовується лише для отримання даних. Це статичний користувач, визначений іменем користувача та паролем (для покращеної безпеки, визначіть пароль як змінну середовища).

Якщо ваш LDAP-сервер дозволяє анонімне вилучення інформації, ви можете встановити опції search_dn іsearch_password як null.

Постачальник користувачів ldap підтримує багато різноманітних опцій конфігурації:

service

тип: string за замовчуванням: ldap

Це імʼя вашого сконфігурованого LDAP-клієнта. Ви можете вільно обирати імʼя, але воно повинно бути унікальним у вашому додатку і не може починатися з цифри чи містити пробіли.

base_dn

тип: string за замовчуванням: null

Це базове відмітне імʼя для каталогу.

search_dn

тип: string за замовчуванням: null

Це відмітне імʼя вашого користувача, доступне лише для читання, яке буде використано для аутентифікації з LDAP-сервером, щоб вилучити інформацію користувача.

search_password

тип: string за замовчуванням: null

Це пароль вашого користувача, доступний лише для читання, який буде аутентифіковано з LDAP-сервером для того, щоб вилучити інформацію користувача.

default_roles

тип: array за замовчуванням: []

Це роль за замовчуванням, як ви хочете надати користувачу, вилученому з LDAP-сервера. Якщо ви не сконфігуруєте цей ключ, ваші користувачі не матимуть жодних ролей і не будуть прийняті, як повністю аутентифіковані.

uid_key

тип: string за замовчуванням: sAMAccountName

Це ключ входу для використання в якості ідентифікатора користувача. Залежить від реалізації вашого LDAP-сервера. Найчастіше використовуваними значеннями є:

  • sAMAccountName (за замовчуванням)
  • userPrincipalName
  • uid

Якщо ви передасте null як значення цієї опції, використовується ключ UID за замовчуванням - sAMAccountName.

extra_fields

тип: array за замовчуванням: null

Визначає користувацькі поля для пулінгу з LDAP-серверу. Якщо якесь поле не існує, буде викликано \InvalidArgumentException.

filter

тип: string за замовчуванням: ({uid_key}={username})

Цей ключ дозволяє вам сконфігурувати, який LDAP-запит буде використано. Рядок {uid_key} буде замінений значенням конфігурації uid_key(за замовчуванням, sAMAccountName), а рядок {user_identifier} буде замінений імʼям користувача, якого ви намагаєтеся завантажити.

6.2

Починаючи з Symfony 6.2, рядок {username} застарів на користь {user_identifier}.

Наприклад, з uid_key в uid, і якщо ви намагаєтеся завантажити користувача fabpot, фінальним рядком буде (uid=fabpot).

Якщо ви передасте null як значення цієї опції, використовується фільтр за замовчуванням - ({uid_key}={username}).

Щоб запобігти впровадженню LDAP, імʼя користувача буде екрановано.

Синтаксис для ключа filter визначається RFC4515.

Аутентифікація з LDAP-сервером

Аутентифікація з LDAP-сервром може бути проведена з використанням або форми входу або базових постачальників аутентифікації HTTP.

Вони конфігуруються точно так само, як їх копії, які не мають відношення до LDAP, з додаванням двох ключів конфігурації та одного необовʼязкового ключа:

service

тип: string за замовчуванням: ldap

Це імʼя вашого сконфігурованого LDAP-клієнта. Ви можете вільно обирати імʼя, але воно повинно бути унікальним у вашому додатку і не може починатися з цифри або містити пробіли.

dn_string

тип: string за замовчуванням: {username}

Цей ключ визначає форрму рядку, використовуваного для створення відмітного імені користувача з імені користувача. Рядок {username} замінються справжнім іменем користувача людини, яка проходить аутентифікацію.

Наприклад, якщо ваші користувачі мають рядки відмітного імені у вигляді uid=einstein,dc=example,dc=com, то dn_string буде uid={username},dc=example,dc=com.

query_string

тип: string за замовчуванням: null

Цей (необовʼязковий) ключ змушує вашого постачальника користувачів шукати користувача, а потім використовувати знайдене відмітне імʼя для процесу звʼязування. Це корисно при використанні декількох постачальників користувачів LDAP з різними base_dn. Значення цієї опції повинно бути валідним рядком пошуку (наприклад, uid="{username}"). Значення заповнювача буде замінено справжнім іменем користувача.

Коли використовується ця опція, query_string шукактиме відмітне імʼя, вказане dn_string, а відмітне імʼя, яке результує з query_string, буде використано для аутентифікації користувача з його паролем. Дотримуючись попереднього прикладу, якщо ваші користувачі мають наступнні два відмітних імені: dc=companyA,dc=example,dc=com і dc=companyB,dc=example,dc=com, то dn_string повинно бути dc=example,dc=com.

Памʼятайте, що імена користувачів повинні бути унікальними в обох відмітних іменах, так як постачальник аутентифікації не зможе обрати правильного користувача для процесу звʼязування, якщо буде знайдено більше одного.

Приклади наведені нижче відносяться як до form_login_ldap, так і до http_basic_ldap.

Приклад конфігурації для форми входу

  • YAML
  • XML
  • PHP
1
2
3
4
5
6
7
8
9
10
11
# config/packages/security.yaml
security:
    # ...

    firewalls:
        main:
            # ...
            form_login_ldap:
                # ...
                service: Symfony\Component\Ldap\Ldap
                dn_string: 'uid={username},dc=example,dc=com'

Приклад конфігурації для Базового HTTP

  • YAML
  • XML
  • PHP
1
2
3
4
5
6
7
8
9
10
# config/packages/security.yaml
security:
    # ...

    firewalls:
        main:
            stateless: true
            http_basic_ldap:
                service: Symfony\Component\Ldap\Ldap
                dn_string: 'uid={username},dc=example,dc=com'

Приклад конфігурації для форми входу та query_string

  • YAML
  • XML
  • PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
# config/packages/security.yaml
security:
    # ...

    firewalls:
        main:
            # ...
            form_login_ldap:
                service: Symfony\Component\Ldap\Ldap
                dn_string: 'dc=example,dc=com'
                query_string: '(&(uid={username})(memberOf=cn=users,ou=Services,dc=example,dc=com))'
                search_dn: '...'
                search_password: 'the-raw-password'