2012-01-31 2 views
28

У меня есть два брандмауэров:AUTHENTICATE множественных Symfony2 брандмауэров с формой один логина

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

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

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

ответ

59

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

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

security: 
    // providers etc ... 

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

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

Чтобы предотвратить это повторное приглашение, вы можете добавить свойство «контекст» для каждого определения брандмауэра вы хотите одну и ту же проверку подлинности - так:

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 

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

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

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

+1

блестящий! работает как шарм. – anushr

+1

Ницца, я искал это в течение долгого времени! – PMoubed

+1

У меня точно такая же проблема, единственная разница заключается в том, что «главный» брандмауэр аутентифицируется с использованием формы входа в систему вместо http_basic, поэтому брандмауэр «api» предлагает пользователю снова войти в систему, даже если пользователь аутентифицирован через бланк. Есть ли способ заставить его работать? – Xocoatzin