Было несколько вещей, которые я должен был сделать, чтобы заставить это работать.
Контекстный ключ: Как описано 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
Спасибо. Помещение обоих брандмауэров в такой же контекст фиксировало мою проблему. – shrty
Спасибо, что сообщили мне, @shrty. Рад, что это помогло! – Sam
hey @Sam, я пытаюсь сделать то же самое, что и вы в этом вопросе, но с добавлением разных хостов (выдача себя за хозяев). Пожалуйста, проверьте это [здесь] (https://stackoverflow.com/questions/41153988/symfony-impersonate-across-different-hosts) и дайте мне знать, если вы придумаете какую-нибудь идею ... спасибо! – rrubiorr81