我有一个带有两个防火墙的Symfony应用程序,一个用于管理员,一个用于普通用户。
#1221 - Incorrect usage of UNION and ORDER BY
我希望管理员用户能够impersonate普通用户。我怎么能这样做,因为他们使用的是单独的防火墙和独立的用户提供商?
答案 0 :(得分:12)
我必须做几件事才能让它发挥作用。
上下文密钥:如上所述here,我必须为两个防火墙提供相同的上下文。如果没有这个,管理员在尝试切换用户时会被带到登录页面。
配置两个防火墙:我必须将基本的switch_user
配置密钥添加到两个防火墙:
switch_user:
role: ROLE_ADMIN
如果我只是将配置放在main_site
防火墙上,则当退出模拟并转到管理页面时,管理员会收到拒绝访问的消息。 (例如,路线/admin/dashboard?_switch_user=_exit
将给出403)。
main_site
配置中提供商密钥:
main_site:
switch_user:
role: ROLE_ADMIN
provider: fos_userbundle
如果没有这个,我收到错误“切换用户失败 - 找不到user@example.com”。深入研究代码,结果发现正在使用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