授权

编辑本页

警告:您正在浏览的文档欧宝体育电话欧宝娱乐app下载地址Symfony 5.1,现已不再维护。

本页的更新版本用于Sy欧宝娱乐app下载地址mfony 6.2(当前稳定版本)。

授权

当任何身份验证提供程序(请参阅身份验证)已经验证了尚未验证的令牌,则将返回一个已验证的令牌。对象中直接设置此令牌TokenStorageInterface使用它的setToken ()方法。

从那时起,对用户进行身份验证,即识别。现在,应用程序的其他部分可以使用令牌来决定用户是否可以请求某个URI或修改某个对象。这个决定将由一个实例做出AccessDecisionManagerInterface

授权决策总是基于以下几点:

  • 当前令牌
    例如,令牌getRoleNames ()方法可以用来检索当前用户的角色(例如。ROLE_SUPER_ADMIN),或者决定可能基于令牌的类别。
  • 一组属性
    每个属性代表用户应该拥有的某种权利,例如:ROLE_ADMIN确保用户是管理员。
  • 对象(可选)
    需要检查访问控制的任何对象,如文章或评论对象。

访问决策管理器

由于决定用户是否被授权执行某个操作可能是一个复杂的过程,因此标准AccessDecisionManager它本身取决于多个投票者,并根据它所获得的所有选票(积极、消极或中立)做出最终裁决。它识别了几种策略:

肯定的(默认)
只要有一个选民批准访问,就授予访问权限;
共识
如果允许进入的选民多于拒绝进入的选民,则允许进入;
一致
只有在没有选民拒绝的情况下才允许进入。如果所有选民都投了弃权票,则该决定以投票结果为依据allow_if_all_abstain配置选项(默认为).
优先级

允许或拒绝第一个没有弃权的选民进入;

5.1

优先级在Symfony 5.1中引入了版本策略。欧宝娱乐app下载地址

可用选项的详细用法:

12 3 4 5 6 7 8 9 10 11 12 13 14 16 17 18 19 20
使用欧宝娱乐app下载地址组件安全核心授权AccessDecisionManager// Symfony\Compo欧宝娱乐app下载地址nent\Security\Core\Authorization\Voter\VoterInterface的实例选民=[…];// " positive ", "consensus", "unanimous", "priority"中的一个策略=……;//当所有选民弃权时,是否允许进入allowIfAllAbstainDecisions=……;//当没有多数意见时是否授予访问权限(只适用于“协商一致”策略)allowIfEqualGrantedDeniedDecisions=……;accessDecisionManagerAccessDecisionManager (选民策略allowIfAllAbstainDecisionsallowIfEqualGrantedDeniedDecisions);

另请参阅

中更改默认策略配置

选民

选民是VoterInterface,这意味着他们必须实现一些方法,允许决策管理器使用它们:

投票(TokenInterface $token, $object,数组$attributes)
的类常量之一,此方法将执行实际投票并返回值VoterInterface,即VoterInterface: ACCESS_GRANTEDVoterInterface: ACCESS_DENIEDVoterInterface: ACCESS_ABSTAIN

Security组件包含了一些标准投票者,涵盖了很多用例:

AuthenticatedVoter

AuthenticatedVoter投票人支持属性IS_AUTHENTICATED_FULLYIS_AUTHENTICATED_REMEMBEREDIS_AUTHENTICATED_ANONYMOUSLY,根据当前的身份验证级别授予访问权限,即用户是完全身份验证,还是仅基于“记住我”cookie,甚至是匿名身份验证?

它还支持属性IS_ANONYMOUSIS_REMEMBEREDIS_IMPERSONATOR基于特定的身份验证状态授予访问权限。

5.1

IS_ANONYMOUSIS_REMEMBERED而且IS_IMPERSONATOR属性是在Symfony 5.1中引入的。欧宝娱乐app下载地址

12 3 4 5 6 7 8 9 10 11 12 13
使用欧宝娱乐app下载地址组件安全核心身份验证AuthenticationTrustResolvertrustResolverAuthenticationTrustResolver ();authenticatedVoterAuthenticatedVoter (trustResolver);// Symfony\Comp欧宝娱乐app下载地址onent\Security\Core\Authentication\Token\TokenInterface实例令牌=……;//任意对象对象=……;投票authenticatedVoter->投票(令牌对象, (“IS_AUTHENTICATED_FULLY”]);

RoleVoter

RoleVoter支持以具备ROLE_并在至少需要一个时授予用户访问权限具备ROLE_ *属性可以在令牌返回的角色数组中找到getRoleNames ()方法:

1 2 3 4 5
使用欧宝娱乐app下载地址组件安全核心授权选民RoleVoterroleVoterRoleVoter (“具备ROLE_”);roleVoter->投票(令牌对象, (“ROLE_ADMIN”]);

RoleHierarchyVoter

RoleHierarchyVoter扩展RoleVoter并提供了一些额外的功能:它知道如何处理角色的层次结构。例如,aROLE_SUPER_ADMIN角色可以有子角色ROLE_ADMIN而且ROLE_USER,这样当某个对象需要用户拥有时ROLE_ADMIN角色时,它将访问权限授予实际上拥有ROLE_ADMIN角色,也是给用户的ROLE_SUPER_ADMIN角色:

1 2 3 4 5 6 7 8 9 10
使用欧宝娱乐app下载地址组件安全核心授权选民RoleHierarchyVoter使用欧宝娱乐app下载地址组件安全核心角色RoleHierarchy层次结构= (“ROLE_SUPER_ADMIN”= > [“ROLE_ADMIN”“ROLE_USER”]];roleHierarchyRoleHierarchy (层次结构);roleHierarchyVoterRoleHierarchyVoter (roleHierarchy);

ExpressionVoter

ExpressionVoter属性所创建的表达式的求值来授予访问权ExpressionLanguage组件.这些表达式可以访问一些特殊安全变量

12 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
使用欧宝娱乐app下载地址组件ExpressionLanguage表达式使用欧宝娱乐app下载地址组件安全核心授权选民ExpressionVoter/ /欧宝娱乐app下载地址 Symfony核心组件\ \安全\ \ \ ExpressionLanguage授权;expressionLanguage=……;// Symfony\Comp欧宝娱乐app下载地址onent\Security\Core\Authentication\AuthenticationTrustResolverInterface实例trustResolver=……;/ /欧宝娱乐app下载地址 Symfony \ \安全\ \授权\ AuthorizationCheckerInterface核心组件authorizationChecker=……;expressionVoterExpressionVoter (expressionLanguagetrustResolverauthorizationChecker);// Symfony\Comp欧宝娱乐app下载地址onent\Security\Core\Authentication\Token\TokenInterface实例令牌=……;//任意对象对象=……;表达式表达式(“role_names或(不是is_anonymous()和user.isSuperAdmin())中的“ROLE_ADMIN””投票expressionVoter->投票(令牌对象, (表达式]);

请注意

当您创建自己的投票人时,您可以使用它的构造函数注入它做出决定所需的任何依赖项。

角色

角色是表示用户所拥有的特定权限的字符串。“编辑博客文章”“创建发票”).你可以自由选择这些弦。唯一的要求是他们必须从具备ROLE_前缀(例如。ROLE_POST_EDITROLE_INVOICE_CREATE).

使用决策管理器

访问监听器

访问决策管理器可以在请求中的任何位置使用,以决定当前用户是否有权访问给定的资源。基于URL模式限制访问的一种可选但有用的方法是AccessListener,它是防火墙侦听器之一(请参阅防火墙与授权),它会为每个匹配防火墙映射的请求触发(请参见防火墙与授权).

它使用访问映射(应该是的实例)AccessMapInterface),其中包含请求匹配器和当前用户访问应用程序所需的相应属性集:

12 3 4 5 6 7 8 9 10 11 12 13 14 15 16
使用欧宝娱乐app下载地址组件HttpFoundationRequestMatcher使用欧宝娱乐app下载地址组件安全核心身份验证令牌存储TokenStorage使用欧宝娱乐app下载地址组件安全HttpAccessMap使用欧宝娱乐app下载地址组件安全Http防火墙AccessListeneraccessMapAccessMap ();tokenStorageTokenStorage ();requestMatcherRequestMatcher (“^ /管理”);accessMap->add (requestMatcher, (“ROLE_ADMIN”]);accessListenerAccessListener (tokenStorageaccessDecisionManageraccessMapauthenticationManager);

授权检查程序

访问决策管理器也可用于应用程序的其他部分isGranted ()方法AuthorizationChecker.调用此方法将直接将问题委托给访问决策管理器:

12 3 4 5 6 7 8 9 10 11 12
使用欧宝娱乐app下载地址组件安全核心授权AuthorizationChecker使用欧宝娱乐app下载地址组件安全核心异常AccessDeniedExceptionauthorizationCheckerAuthorizationChecker (tokenStorageauthenticationManageraccessDecisionManager);如果(!authorizationChecker->isGranted (“ROLE_ADMIN”)) {AccessDeniedException ();}
此工作,包括代码示例,是根据创作共用BY-SA 3.0许可证。