首页一个> 欧宝体育电话 安全一个> 如何模拟用户一个> 如何模拟用户 编辑本页一个> 警告:您正在浏览的文档欧宝体育电话<一个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(当前稳定版本)。 了解模拟何时处于活动状态一个> 查找原用户一个> 控制查询参数一个> 限制用户切换一个> 事件一个> 谨慎 用户模拟与某些身份验证机制不兼容(例如。REMOTE_USER),以便在每次请求时发送身份验证信息。 方法来模拟用户switch_user防火墙侦听器: YAML XML PHP 1 2 3 4 5 6 7 8 #配置/包/ security.yaml安全:#……防火墙:主要:#……switch_user:真正的 12 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 <!——config/packages/security.xml——> .xml<??> . xml version="1.0" encoding="UTF-8"<srv:容器xmlns=“http://欧宝娱乐app下载地址www.oldmanjams.com/schema/dic/security”xmlns: xsi=“http://www.w3.org/2001/XMLSchema-instance”xmlns:深水救生艇=“http://欧宝娱乐app下载地址www.oldmanjams.com/schema/dic/services”xsi: schemaLocation=“http://欧宝娱乐app下载地址www.oldmanjams.com/schema/dic/services //www.oldmanjams.com/schema/dic/services/services-1.0.xsd //www.oldmanjams.com/schema/dic/security //www.oldmanjams.com/schema/dic/security/security-1.0.xsd”><配置><!——……--><防火墙的名字=“主要”><!——……--><切换用户/>防火墙>配置>srv:容器> 1 2 3 4 5 6 7 8 9 10 / /配置/包/ security.php使用欧宝娱乐app下载地址\配置\SecurityConfig;返回静态函数(SecurityConfig$安全){/ /……$安全->防火墙(“主要”)/ /……->switchUser ();}; 属性添加查询字符串,以切换到另一个用户_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一个>是将此角色提供给需要它的用户的好方法。 IS_IMPERSONATOR检查模拟在此会话中是否处于活动状态。使用这个特殊的角色,例如,在模板中显示一个退出模拟的链接: 1 2 3 {%如果is_granted (IS_IMPERSONATOR) %}<一个href="{{impersonation_exit_path(path('主页'))}}">退出模拟一个>{%endif%} 5.1 的IS_IMPERSONATOR在Symfony 5.1中引入。欧宝娱乐app下载地址使用ROLE_PREVIOUS_ADMIN在Symfony 欧宝娱乐app下载地址5.1之前。 SwitchUserToken实例。使用下面的代码片段获取原始令牌,该令牌使您可以访问模拟用户: 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 / / src /服务/ SomeService.php名称空间应用程序\服务;使用欧宝娱乐app下载地址\组件\安全\核心\身份验证\令牌\SwitchUserToken;使用欧宝娱乐app下载地址\组件\安全\核心\安全;/ /……类SomeService{私人$安全;公共函数__construct(安全$安全){$这->安全=$安全;}公共函数someMethod(){/ /……$令牌=$这->安全->getToken ();如果($令牌运算符SwitchUserToken) {$impersonatorUser=$令牌->getOriginalToken ()->getUser ();}/ /……}} ROLE_ALLOWED_TO_SWITCH的角色。方法修改此角色的名称角色设置。方法调整查询参数名称参数设置: YAML XML PHP 1 2 3 4 5 6 7 8 #配置/包/ security.yaml安全:#……防火墙:主要:#……switch_user:{角色:ROLE_ADMIN,参数:_want_to_be_this_user} 12 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 <!——config/packages/security.xml——> .xml<??> . xml version="1.0" encoding="UTF-8"<srv:容器xmlns=“http://欧宝娱乐app下载地址www.oldmanjams.com/schema/dic/security”xmlns: xsi=“http://www.w3.org/2001/XMLSchema-instance”xmlns:深水救生艇=“http://欧宝娱乐app下载地址www.oldmanjams.com/schema/dic/services”xsi: schemaLocation=“http://欧宝娱乐app下载地址www.oldmanjams.com/schema/dic/services //www.oldmanjams.com/schema/dic/services/services-1.0.xsd //www.oldmanjams.com/schema/dic/security //www.oldmanjams.com/schema/dic/security/security-1.0.xsd”><配置><!——……--><防火墙的名字=“主要”><!——……--><切换用户角色=“ROLE_ADMIN”参数=“_want_to_be_this_user”/>防火墙>配置>srv:容器> 12 3 4 5 6 7 8 9 10 11 12 / /配置/包/ security.php使用欧宝娱乐app下载地址\配置\SecurityConfig;返回静态函数(SecurityConfig$安全){/ /……$安全->防火墙(“主要”)/ /……->switchUser ()->角色(“ROLE_ADMIN”)->参数(“_want_to_be_this_user”);}; switch_user检查一些新的自定义属性。这可以是任何东西,但是不能开始具备ROLE_(强制只有你的投票人会被调用): YAML XML PHP 1 2 3 4 5 6 7 8 #配置/包/ security.yaml安全:#……防火墙:主要:#……switch_user:{角色:CAN_SWITCH_USER} 12 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 <!——config/packages/security.xml——> .xml<??> . xml version="1.0" encoding="UTF-8"<srv:容器xmlns=“http://欧宝娱乐app下载地址www.oldmanjams.com/schema/dic/security”xmlns: xsi=“http://www.w3.org/2001/XMLSchema-instance”xmlns:深水救生艇=“http://欧宝娱乐app下载地址www.oldmanjams.com/schema/dic/services”xsi: schemaLocation=“http://欧宝娱乐app下载地址www.oldmanjams.com/schema/dic/services //www.oldmanjams.com/schema/dic/services/services-1.0.xsd //www.oldmanjams.com/schema/dic/security //www.oldmanjams.com/schema/dic/security/security-1.0.xsd”><配置><!——……--><防火墙的名字=“主要”><!——……--><切换用户角色=“CAN_SWITCH_USER”/>防火墙>配置>srv:容器> 1 2 3 4 5 6 7 8 9 10 11 / /配置/包/ security.php使用欧宝娱乐app下载地址\配置\SecurityConfig;返回静态函数(SecurityConfig$安全){/ /……$安全->防火墙(“主要”)/ /……->switchUser ()->角色(“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下载地址\组件\EventDispatcher\EventSubscriberInterface;使用欧宝娱乐app下载地址\组件\安全\Http\事件\SwitchUserEvent;使用欧宝娱乐app下载地址\组件\安全\Http\SecurityEvents;类SwitchUserSubscriber实现了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一个>许可证。 欧宝娱乐app下载地址Symfony 5.3是<一个href="//www.oldmanjams.com/backers">支持一个>通过<一个类="link stretched-link" href="https://jolicode.com">JoliCode一个>. 在线Symfo欧宝娱乐app下载地址ny认证,现在就开始吧!一个> 检查开发、测试、阶段和生产阶段的代码性能一个> 接受SensioLabs专家的培训(2 - 6天的课程-法语或英语)。一个>
如何模拟用户 编辑本页一个> 警告:您正在浏览的文档欧宝体育电话<一个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(当前稳定版本)。 了解模拟何时处于活动状态一个> 查找原用户一个> 控制查询参数一个> 限制用户切换一个> 事件一个> 谨慎 用户模拟与某些身份验证机制不兼容(例如。REMOTE_USER),以便在每次请求时发送身份验证信息。 方法来模拟用户switch_user防火墙侦听器: YAML XML PHP 1 2 3 4 5 6 7 8 #配置/包/ security.yaml安全:#……防火墙:主要:#……switch_user:真正的 12 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 <!——config/packages/security.xml——> .xml<??> . xml version="1.0" encoding="UTF-8"<srv:容器xmlns=“http://欧宝娱乐app下载地址www.oldmanjams.com/schema/dic/security”xmlns: xsi=“http://www.w3.org/2001/XMLSchema-instance”xmlns:深水救生艇=“http://欧宝娱乐app下载地址www.oldmanjams.com/schema/dic/services”xsi: schemaLocation=“http://欧宝娱乐app下载地址www.oldmanjams.com/schema/dic/services //www.oldmanjams.com/schema/dic/services/services-1.0.xsd //www.oldmanjams.com/schema/dic/security //www.oldmanjams.com/schema/dic/security/security-1.0.xsd”><配置><!——……--><防火墙的名字=“主要”><!——……--><切换用户/>防火墙>配置>srv:容器> 1 2 3 4 5 6 7 8 9 10 / /配置/包/ security.php使用欧宝娱乐app下载地址\配置\SecurityConfig;返回静态函数(SecurityConfig$安全){/ /……$安全->防火墙(“主要”)/ /……->switchUser ();}; 属性添加查询字符串,以切换到另一个用户_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一个>是将此角色提供给需要它的用户的好方法。 IS_IMPERSONATOR检查模拟在此会话中是否处于活动状态。使用这个特殊的角色,例如,在模板中显示一个退出模拟的链接: 1 2 3 {%如果is_granted (IS_IMPERSONATOR) %}<一个href="{{impersonation_exit_path(path('主页'))}}">退出模拟一个>{%endif%} 5.1 的IS_IMPERSONATOR在Symfony 5.1中引入。欧宝娱乐app下载地址使用ROLE_PREVIOUS_ADMIN在Symfony 欧宝娱乐app下载地址5.1之前。 SwitchUserToken实例。使用下面的代码片段获取原始令牌,该令牌使您可以访问模拟用户: 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 / / src /服务/ SomeService.php名称空间应用程序\服务;使用欧宝娱乐app下载地址\组件\安全\核心\身份验证\令牌\SwitchUserToken;使用欧宝娱乐app下载地址\组件\安全\核心\安全;/ /……类SomeService{私人$安全;公共函数__construct(安全$安全){$这->安全=$安全;}公共函数someMethod(){/ /……$令牌=$这->安全->getToken ();如果($令牌运算符SwitchUserToken) {$impersonatorUser=$令牌->getOriginalToken ()->getUser ();}/ /……}} ROLE_ALLOWED_TO_SWITCH的角色。方法修改此角色的名称角色设置。方法调整查询参数名称参数设置: YAML XML PHP 1 2 3 4 5 6 7 8 #配置/包/ security.yaml安全:#……防火墙:主要:#……switch_user:{角色:ROLE_ADMIN,参数:_want_to_be_this_user} 12 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 <!——config/packages/security.xml——> .xml<??> . xml version="1.0" encoding="UTF-8"<srv:容器xmlns=“http://欧宝娱乐app下载地址www.oldmanjams.com/schema/dic/security”xmlns: xsi=“http://www.w3.org/2001/XMLSchema-instance”xmlns:深水救生艇=“http://欧宝娱乐app下载地址www.oldmanjams.com/schema/dic/services”xsi: schemaLocation=“http://欧宝娱乐app下载地址www.oldmanjams.com/schema/dic/services //www.oldmanjams.com/schema/dic/services/services-1.0.xsd //www.oldmanjams.com/schema/dic/security //www.oldmanjams.com/schema/dic/security/security-1.0.xsd”><配置><!——……--><防火墙的名字=“主要”><!——……--><切换用户角色=“ROLE_ADMIN”参数=“_want_to_be_this_user”/>防火墙>配置>srv:容器> 12 3 4 5 6 7 8 9 10 11 12 / /配置/包/ security.php使用欧宝娱乐app下载地址\配置\SecurityConfig;返回静态函数(SecurityConfig$安全){/ /……$安全->防火墙(“主要”)/ /……->switchUser ()->角色(“ROLE_ADMIN”)->参数(“_want_to_be_this_user”);}; switch_user检查一些新的自定义属性。这可以是任何东西,但是不能开始具备ROLE_(强制只有你的投票人会被调用): YAML XML PHP 1 2 3 4 5 6 7 8 #配置/包/ security.yaml安全:#……防火墙:主要:#……switch_user:{角色:CAN_SWITCH_USER} 12 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 <!——config/packages/security.xml——> .xml<??> . xml version="1.0" encoding="UTF-8"<srv:容器xmlns=“http://欧宝娱乐app下载地址www.oldmanjams.com/schema/dic/security”xmlns: xsi=“http://www.w3.org/2001/XMLSchema-instance”xmlns:深水救生艇=“http://欧宝娱乐app下载地址www.oldmanjams.com/schema/dic/services”xsi: schemaLocation=“http://欧宝娱乐app下载地址www.oldmanjams.com/schema/dic/services //www.oldmanjams.com/schema/dic/services/services-1.0.xsd //www.oldmanjams.com/schema/dic/security //www.oldmanjams.com/schema/dic/security/security-1.0.xsd”><配置><!——……--><防火墙的名字=“主要”><!——……--><切换用户角色=“CAN_SWITCH_USER”/>防火墙>配置>srv:容器> 1 2 3 4 5 6 7 8 9 10 11 / /配置/包/ security.php使用欧宝娱乐app下载地址\配置\SecurityConfig;返回静态函数(SecurityConfig$安全){/ /……$安全->防火墙(“主要”)/ /……->switchUser ()->角色(“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下载地址\组件\EventDispatcher\EventSubscriberInterface;使用欧宝娱乐app下载地址\组件\安全\Http\事件\SwitchUserEvent;使用欧宝娱乐app下载地址\组件\安全\Http\SecurityEvents;类SwitchUserSubscriber实现了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">事件和事件监听器一个>.