如何模拟用户

编辑本页

警告:您正在浏览的文档欧宝体育电话<一个href="//www.oldmanjams.com/releases/5.3">欧宝娱乐app下载地址Symfony 5.3,现已不再维护。

读<一个href="//www.oldmanjams.com/doc/current/security/impersonating_user.html">本页的更新版本用于Sy欧宝娱乐app下载地址mfony 6.2(当前稳定版本)。

方法来模拟用户switch_user防火墙侦听器:

  • YAML
  • XML
  • PHP
1 2 3 4 5 6 7 8
#配置/包/ security.yaml安全:#……防火墙:主要:#……switch_user:真正的

属性添加查询字符串,以切换到另一个用户_switch_user参数和用户名(或任何用户提供程序用来加载用户的字段)作为当前URL的值:

1
http://example.com/somewhere?_switch_user=thomas

提示

而不是添加_switch_user查询字符串参数时,可以传入用户名HTTP_X_SWITCH_USER头。

若要切换回原始用户,请使用特殊_exit用户名:

1
http://example.com/somewhere?_switch_user=_exit

此特性仅对具有特殊角色的用户可用ROLE_ALLOWED_TO_SWITCH.使用<一个href="//www.oldmanjams.com/doc/5.3/security.html" class="reference internal">role_hierarchy是将此角色提供给需要它的用户的好方法。

switch_user检查一些新的自定义属性。这可以是任何东西,但是不能开始具备ROLE_(强制只有你的投票人会被调用):

  • YAML
  • XML
  • PHP
1 2 3 4 5 6 7 8
#配置/包/ security.yaml安全:#……防火墙:主要:#……switch_user:角色:CAN_SWITCH_USER

然后,创建一个响应此角色的voter类,并包括任何您想要的自定义逻辑:

12 34 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51
/ / src /安全/选民/ SwitchToCustomerVoter.php名称空间应用程序安全选民使用欧宝娱乐app下载地址组件安全核心身份验证令牌TokenInterface使用欧宝娱乐app下载地址组件安全核心授权选民选民使用欧宝娱乐app下载地址组件安全核心安全使用欧宝娱乐app下载地址组件安全核心用户用户界面SwitchToCustomerVoter扩展选民私人安全公共函数__construct(安全安全->安全=安全;}受保护的函数支持属性主题保龄球返回in_array (属性, (“CAN_SWITCH_USER”) & &主题运算符用户界面;}受保护的函数voteOnAttribute属性主题, TokenInterface令牌保龄球用户令牌->getUser ();//如果用户是匿名的,或者如果主题不是用户,不授予访问权限如果(!用户运算符用户界面|| !主题运算符用户界面){返回;}//你仍然可以检查ROLE_ALLOWED_TO_SWITCH如果->安全->isGranted (“ROLE_ALLOWED_TO_SWITCH”)) {返回真正的;}//检查你想要的任何角色如果->安全->isGranted (“ROLE_TECH_SUPPORT”)) {返回真正的;}如果($ User ->isAllowedToSwitch()){返回true;}* /返回;}}

就是这样!当切换用户时,您的选民现在可以完全控制是否允许这样做。如果你的选民没有被召集,看<一个href="//www.oldmanjams.com/doc/5.3/security/voters.html" class="reference internal">如何使用选民检查用户权限

security.switch_user事件。的<一个href="https://github.com/symfony/symfony/blob/5.3/src/Symfony/Component/Security/Http/Event/SwitchUserEvent.php" class="reference external" title="SwitchUserEvent"rel="external noopener noreferrer" target="_blank">SwitchUserEvent传递给侦听器,您可以使用它来获取您现在正在模拟的用户。

的<一个href="//www.oldmanjams.com/doc/5.3/session/locale_sticky_session.html" class="reference internal">在用户会话期间使区域设置“粘滞”当您模拟用户时,Article不会更新区域设置。如果你想要确保在切换用户时更新区域设置,请在此事件上添加一个事件订阅器:

12 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
/ / src / EventListener / SwitchUserSubscriber.php名称空间应用程序EventListener使用欧宝娱乐app下载地址组件EventDispatcherEventSubscriberInterface使用欧宝娱乐app下载地址组件安全Http事件SwitchUserEvent使用欧宝娱乐app下载地址组件安全HttpSecurityEventsSwitchUserSubscriber实现了EventSubscriberInterface公共函数onSwitchUser(SwitchUserEvent事件无效请求事件->getRequest ();如果请求->hasSession() && (会话请求->getSession ())) {会话->集(“_locale”//假设你的用户有一些getLocale()方法事件->getTargetUser ()->getLocale ());}}公共静态函数getSubscribedEvents()数组返回// constant for security.switch_userSecurityEvents::SWITCH_USER = >“onSwitchUser”,);}}

就是这样!如果你在用<一个href="//www.oldmanjams.com/doc/5.3/service_container.html" class="reference internal">默认的服务。yaml的配置, 欧宝娱乐app下载地址Symfony将自动发现您的服务和呼叫onSwitchUser当切换用户发生时。

有关事件订阅者的详细信息,请参见<一个href="//www.oldmanjams.com/doc/5.3/event_dispatcher.html" class="reference internal">事件和事件监听器

此工作,包括代码示例,是根据<一个rel="license" href="https://creativecommons.org/licenses/by-sa/3.0/">创作共用BY-SA 3.0许可证。