Symfony 模拟 - 单独的防火墙和单独的用户提供者
Symfony impersonation - separate firewalls and separate user providers
我有一个带有两个防火墙的 Symfony 应用程序,一个用于管理员,一个用于普通用户。
admin:
provider: admin
# etc
main_site:
form_login:
provider: fos_userbundle
csrf_provider: form.csrf_provider
我希望管理员用户能够 impersonate 普通用户。鉴于他们使用单独的防火墙和单独的用户提供商,我该怎么做?
为了让它工作,我必须做几件事。
上下文键: 如所述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
没有这个,我得到了错误"Switch User failed - user@example.com not found"。深挖代码,原来是使用了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
#
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
我有一个带有两个防火墙的 Symfony 应用程序,一个用于管理员,一个用于普通用户。
admin:
provider: admin
# etc
main_site:
form_login:
provider: fos_userbundle
csrf_provider: form.csrf_provider
我希望管理员用户能够 impersonate 普通用户。鉴于他们使用单独的防火墙和单独的用户提供商,我该怎么做?
为了让它工作,我必须做几件事。
上下文键: 如所述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
没有这个,我得到了错误"Switch User failed - user@example.com not found"。深挖代码,原来是使用了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
#
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