Аутентификация нескольких брандмауэров Symfony2 с помощью одной формы входа - PullRequest
30 голосов
/ 31 января 2012

У меня есть два брандмауэра:

  1. api (для вызовов API)
  2. main (для всего остального)

Мой клиентвход в приложение происходит через брандмауэр main.Однако он взаимодействует с конечными точками под брандмауэром api для извлечения данных.Проблема здесь в том, что я не хочу заставлять пользователя входить во второй раз для аутентификации на втором брандмауэре.

Как я могу аутентифицироваться на обоих брандмауэрах с помощью только одной формы входа?

1 Ответ

60 голосов
/ 23 февраля 2012

Возможно, вы могли бы попробовать свойство межсетевого экрана 'context'.

Скажем, у вас есть что-то вроде конфигурации (что, вероятно, и есть):

security:
    // providers etc ...

    firewall:
        main:
            pattern: # ...
            provider: my_users
            http_basic: ~
        api:
            pattern: # ...
            provider: my_users
            http_basic: ~

В этом случае сеанс пользователябудет содержать свойство «_security_main» после аутентификации на «основном» брандмауэре, а затем, когда они попытаются получить доступ к местоположению «api», им будет предложено повторно выполнить аутентификацию, а затем получит свойство сеанса «_security_api».

Чтобы предотвратить это повторное приглашение, вы можете добавить свойство 'context' к каждому определению брандмауэра, для которого вы хотите использовать одну и ту же аутентификацию - так:

security:
    # providers etc ...

    firewall:
        main:
            pattern: # ...
            provider: my_users
            http_basic: ~
            context: primary_auth  # new
        api:
            pattern: # ...
            provider: my_users
            http_basic: ~
            context: primary_auth  # new

В этом случае при аутентификации с помощью 'main 'firewall, свойство' _security_primary_auth 'будет установлено в сеансе пользователя.Любые последующие запросы внутри firewill 'api' будут затем использовать значение '_security_primary_auth' для установления статуса аутентификации (и, таким образом, пользователь будет выглядеть аутентифицированным).

Конечно, это совместное использование контекста аутентификации будет работать в обоих направлениях (независимо от того, выполняют ли они авторизацию сначала с помощью основного или межсетевого экрана api) - если бы вы хотели только кратковременность в одном направлении, все было бы сложнее.

Надеюсь, это поможет.

...