Symfony模拟 - 单独的防火墙和单独的用户提供程序

Sam*_*Sam 4 impersonation symfony fosuserbundle

我有一个带有两个防火墙的Symfony应用程序,一个用于管理员,一个用于普通用户.

admin:
    provider: admin
    # etc

main_site:
    form_login:
        provider: fos_userbundle
        csrf_provider: form.csrf_provider
Run Code Online (Sandbox Code Playgroud)

我希望管理员用户能够冒充普通用户.我怎么能这样做,因为他们使用单独的防火墙和单独的用户提供商?

Sam*_*Sam 12

我需要做几件事才能让它发挥作用.

上下文关键字:如上所述这里,我不得不放弃这两个防火墙相同的上下文.如果没有这个,管理员在尝试切换用户时会被带到登录页面.

配置两个防火墙:我必须将基本switch_user配置密钥添加到两个防火墙:

switch_user:
    role: ROLE_ADMIN
Run Code Online (Sandbox Code Playgroud)

如果我只是将配置放在main_site防火墙上,则管理员在退出模拟并进入管理页面时会收到拒绝访问的消息.(例如,路线/admin/dashboard?_switch_user=_exit将给出403).

main_site配置上的提供者密钥:

main_site:
    switch_user:
        role: ROLE_ADMIN
        provider: fos_userbundle
Run Code Online (Sandbox Code Playgroud)

没有这个,我收到错误"切换用户失败 - 找不到user@example.com".深入研究代码,结果发现admin正在使用用户提供程序,当然使用该提供程序时无法找到普通用户.

(这里讨论配置的provider关键.)switch_user

或者,我可以将其添加为防火墙本身的提供者密钥:

main_site:
    switch_user:
        role: ROLE_ADMIN
    provider: fos_userbundle
Run Code Online (Sandbox Code Playgroud)

您将从我的问题中的配置中看到,它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
Run Code Online (Sandbox Code Playgroud)