Аутентифікація з LDAP-сервером
Дата оновлення перекладу 2024-06-03
Аутентифікація з 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 з наступним визначенням сервісу:
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
.
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-клієнта. Ви можете вільно обирати імʼя, але воно повинно бути унікальним у вашому додатку і не може починатися з цифри чи містити пробіли.
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}
буде замінений імʼям користувача, якого
ви намагаєтеся завантажити.
Наприклад, з 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
.
Приклад конфігурації для форми входу
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={user_identifier},dc=example,dc=com'
Приклад конфігурації для Базового HTTP
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={user_identifier},dc=example,dc=com'
Приклад конфігурації для форми входу та query_string
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={user_identifier})(memberOf=cn=users,ou=Services,dc=example,dc=com))'
search_dn: '...'
search_password: 'the-raw-password'