Подтвердить что ты не робот

Аутентификация нескольких брандмауэров Symfony2 с одной формой входа

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

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

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

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

4b9b3361

Ответ 1

Возможно, вы можете попробовать свойство "контекстного" брандмауэра.

Скажите, что у вас есть что-то вроде этого (что, предположительно, вы делаете):

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

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

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

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