Symfony2 chain providers

Автор: Aport Суббота, Январь 31st, 2015 Нет комментариев

Рубрика: Язык PHP

Решил использовать несколько провайдеров и нашел в документации такой пример:

# app/config/security.yml
security:
    providers:
        chain_provider:
            chain:
                providers: [in_memory, user_db]
        in_memory:
            memory:
                users:
                    foo: { password: test }
        user_db:
            entity: { class: Acme\UserBundle\Entity\User, property: username }

И подумалось мне, что работать провайдеры будут так:

  • если 1-ый провайдер не опознал пользователя, то переходим ко второму
  • если 2-ой провайдером не опознал пользователя, то переходим ко третьему
  • и т.д.

Однако, на деле оказалось что такая логика работает, только если провайдеры разного типа.

Напомню, Symfony поддерживает следующие типы провайдеров:

  • x509 — авторизация процедуры распределения открытых ключей с помощью сертификатов с цифровыми подписями
  • http_basic - имя пользователя и пароль включаются в состав веб-запроса (HTTP POST или HTTP GET)
  • http_digest — пароль не используется непосредственно, вместо этого клиент авторизуется на сервере с помощью MD5 (username: realm: password)
  • memory — просто в конфиге указываются логины и пароли пользователей (можно указать разные роли)
  • entity — указывается класс сущности и поле по которому будет выполнятся поиск пользователя в базе данных (обычно это поле email)
  • id — указывается название сервиса, который является классом-провайдером

Поэтому, если Вы рассчитывали реализовать 2 одинаковых типа провайдера, но различающихся логикой (например один ищет пользователя в MySQL, а второй в MongoDB), то такую логику нужно реализовывать в одном провайдере (с типом id).

p.s. для каждого из типов авторизации, можно указывать нужный Вам провайдер, например так:

    firewalls:
        ...
        somename:
            ...
            x509:
                provider: some_key_from_above
            http_basic:
                provider: some_key_from_above
            http_digest:
                provider: some_key_from_above
            ...

some_key_from_above - имя провайдера, например in_memory или user_db (не путайте с типом провайдера).

Удачки.

 

Источник: yapro.ru

Оставить комментарий

Чтобы оставлять комментарии Вы должны быть авторизованы.

Похожие посты