2015-07-08 3 views
2

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

admin: 
    provider: admin 
    # etc 

main_site: 
    form_login: 
     provider: fos_userbundle 
     csrf_provider: form.csrf_provider 

Я хотел бы пользователи администратора, чтобы иметь возможность impersonate обычных пользователей. Как я могу это сделать, учитывая, что они используют отдельные брандмауэры и отдельные поставщики пользователей?

ответ

9

Было несколько вещей, которые я должен был сделать, чтобы заставить это работать.

Контекстный ключ: Как описано here, я должен был предоставить оба брандмауэра в том же контексте. Без этого администраторы были отправлены на страницу входа при попытке переключения пользователей.

Config на обоих брандмауэрах: я должен был добавить основные switch_user конфигурационные ключи к как брандмауэров:

switch_user: 
    role: ROLE_ADMIN 

Если я просто поставил конфиг на main_site брандмауэре, админы получил сообщение об отказе в доступе когда выходит из олицетворяет и переходит на страницу администратора. (Например, маршрут /admin/dashboard?_switch_user=_exit даст 403).

Provider ключа на конфигурационном main_site «s:

main_site: 
    switch_user: 
     role: ROLE_ADMIN 
     provider: fos_userbundle 

Без этого, я получил "не Переключить пользователя - [email protected] не найден" ошибка. Копаясь в коде, выяснилось, что используется пользовательский провайдер admin, и, конечно, обычных пользователей не удалось найти при использовании этого провайдера.

(. provider ключа для switch_user конфигурации обсуждается here)

С другой стороны, я мог бы добавить это в качестве ключа поставщика для самого брандмауэра:

main_site: 
    switch_user: 
     role: ROLE_ADMIN 
    provider: fos_userbundle 

Вы увидите из конфигурации в моем вопрос, что fos_userbundle был указан только как поставщик для form_login, а не для main_site в целом, поэтому он не использовался до тех пор, пока я его не добавил. Добавление его в любом месте (олицетворение олицетворения или весь брандмауэр) могло бы сделать трюк.

Вот полный набор соответствующей конфигурации:

admin: 
    provider: admin 
    # Have to put basic switch_user config on both firewalls 
    switch_user: 
     role: ROLE_ADMIN 
    # Both the admin and main_site firewalls have the same context, to allow 
    # cross-firewall impersonation 
    # https://stackoverflow.com/a/17991481/328817 
    context: boardworks 

main_site: 
    form_login: 
     provider: fos_userbundle 
     csrf_provider: form.csrf_provider 
    switch_user: 
     role: ROLE_ADMIN 
     # Have to explicitly set the provider, otherwise the site will use the admin 
     # user provider when looking up the users whom admins are trying to impersonate 
     provider: fos_userbundle 
    # Rather than adding the provider above, I could have added it here: 
    #provider: fos_userbundle 
+0

Спасибо. Помещение обоих брандмауэров в такой же контекст фиксировало мою проблему. – shrty

+0

Спасибо, что сообщили мне, @shrty. Рад, что это помогло! – Sam

+0

hey @Sam, я пытаюсь сделать то же самое, что и вы в этом вопросе, но с добавлением разных хостов (выдача себя за хозяев). Пожалуйста, проверьте это [здесь] (https://stackoverflow.com/questions/41153988/symfony-impersonate-across-different-hosts) и дайте мне знать, если вы придумаете какую-нибудь идею ... спасибо! – rrubiorr81

Смежные вопросы