Как расширить LdapUserProvider и использовать собственный провайдер пользователей LDAP в Symfony?

Я изо всех сил пытаюсь заменить LdapUserProvider.

Я создал своего собственного провайдера (App\Security\MyLdapUserProvider на основе LdapUserProvider, но получающего больше информации) и собственный пользовательский интерфейс (App\Security\MyUser) с дополнительными атрибутами для хранения данных.

В конце концов я хочу получить группы и отображаемое имя пользователя.

Вот моя конфигурация:

services.yaml:

# add more service definitions when explicit configuration is needed
# please note that last definitions always *replace* previous ones
Symfony\Component\Ldap\Ldap:
    arguments: ['@Symfony\Component\Ldap\Adapter\ExtLdap\Adapter']
Symfony\Component\Ldap\Adapter\ExtLdap\Adapter:
    arguments:
        - host: 10.106.1.1
          port: 389
          #encryption: tls
          options:
              protocol_version: 3
              referrals: false

безопасность.yaml:

providers:
    #in_memory: { memory: ~ }
    my_ldap:
        ldap:
            service: Symfony\Component\Ldap\Ldap
            base_dn: "dc=XXXXXX,dc=com"
            search_dn: "CN=XXXXXXXXXX,OU=LDAP,OU=Services Accounts,OU=Administration,DC=XXXXXXXXX,DC=com"
            search_password: "ergergergergerg"
            default_roles: ROLE_USER
            filter: "({uid_key} = {username})"
            uid_key: samAccountName
            #password_attribute: displayName
firewalls:
    dev:
        pattern: ^/(_(profiler|wdt)|css|images|js)/
        security: false

    main:
        pattern: ^/
        security: true
        anonymous: true
        provider: my_ldap
        form_login_ldap:
            login_path: /login
            check_path: /login
            service: Symfony\Component\Ldap\Ldap
            dn_string: 'dc=XXXXXX,dc=com'
            query_string: '(samAccountName = {username})'
        logout:
            path:   /logout
            target: /

Где я могу сообщить поставщику безопасности, чтобы он использовал моего собственного поставщика ldap вместо поставщика по умолчанию?

Процессы Symfony все еще немного сложны для меня, поэтому, если кто-то может найти время, чтобы объяснить...

Документы Symfony — это бесконечный цикл перенаправления между CustomUserProvider > Ldap config > CustomeUSerProvider...

Стоит ли изучать 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 нам нужно возвращать клиентам разные ответы в зависимости от возникшего исключения.
4
0
1 260
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Как описано в главе документации Создание пользовательского поставщика услуг, вам необходимо добавить своего провайдера пользователей в качестве нового ключа в разделе security.providers и настроить его id.

Это id имя вашего пользовательского сервиса User Provider, который в последних версиях symfony соответствует FQCN.

# security.yaml

security:
  providers:
    # the name of your user provider can be anything
    my_ldap_provider:
      id: 'App\Security\MyLdapUserProvider'

Затем вы можете использовать этого провайдера для одного из брандмауэров следующим образом:

security:
  # [..]
  firewalls:
    main:
      pattern: '^/'
      provider: 'my_ldap_provider'

Симфони LdapUserProvider выглядит так:

class LdapUserProvider implements UserProviderInterface
{
    private $ldap;
    private $baseDn;
    private $searchDn;
    private $searchPassword;
    private $defaultRoles;
    private $uidKey;
    private $defaultSearch;
    private $passwordAttribute;
    private $extraFields;

    public function __construct(
      LdapInterface $ldap,
      string $baseDn,
      string $searchDn = null,
      string $searchPassword = null,
      array $defaultRoles = [],
      string $uidKey = null,
      string $filter = null,
      string $passwordAttribute = null,
      array $extraFields = []
    )
    {

Чтобы правильно создать службу MyLdapUserProvider, которая расширяет LdapUserProvider, вам нужно такое определение службы:

# services.yaml

services:
  App\Security\MyLdapUserProvider:
    arguments:
      $adminEmail: '%admin_email%'
      $ldap: '@Symfony\Component\Ldap\Ldap'
      $baseDn: 'dc=XXXXXX,dc=com'
      $searchDn: 'CN=XXXXXXXXXX,OU=LDAP,OU=Services Accounts,OU=Administration,DC=XXXXXXXXX,DC=com'
      $searchPassword: 'ergergergergerg'
      $defaultRoles: ['ROLE_USER']
      $filter: '({uid_key} = {username})'
      $uidKey: 'samAccountName'

Поэтому мне нужно заменить ldap: на id: App\Security\MyLdapUserProvider и сохранить параметры внизу? Я получаю сообщение об ошибке синтаксического анализа... не содержит допустимого YAML: нельзя использовать двоеточие в значении сопоставления без кавычек в строке 13 (рядом с " uid_key: samAccountName")

JeanneD4RK 18.07.2019 13:52

Я обновил ответ. Вам нужно правильно настроить службу провайдера пользователя в services.yaml и избавиться от лишних аргументов в security.yaml под security.providers.<your-provider>. Достаточно просто id сервиса.

Nicolai Fröhlich 18.07.2019 14:00

Почему это не нужно для пользовательского провайдера Symfony Ldap? Как он угадывает, что нужно?

JeanneD4RK 18.07.2019 14:15

Что ж, в случае поставщика Symfony Ldap вы предоставляете дополнительную информацию (baseDn, ... и т. д.) под security.providers, и оттуда она автоматически вводится компонентом безопасности ... в отличие от вашего случая, когда вы хотите использовать свой собственный сервис . Затем вам нужно внедрить зависимости «вручную» при создании службы. Это так просто.

Nicolai Fröhlich 18.07.2019 14:56

Хорошо, все заработало, теперь мне нужно исправить некоторые ошибки в коде, но это не входит в рамки этой темы!

JeanneD4RK 18.07.2019 16:07

Рад слышать, что вы решили свою проблему. Удачного кодирования :)

Nicolai Fröhlich 18.07.2019 16:09

ВЫ решили мою проблему ;) Спасибо! К сожалению, я не могу позволить себе прочитать весь документ. Я бы хотел, чтобы у меня не было таких глупых вопросов, но это не моя основная работа. Меня только попросили быстро написать кое-что и вернуться к моей работе системного администратора.

JeanneD4RK 18.07.2019 16:12

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