授权

编辑该页面

警告:你浏览的文档欧宝体育电话欧宝娱乐app下载地址Symfony 2.3,不再维护。

这个页面的更新版本Symf欧宝娱乐app下载地址ony 6.2(当前的稳定版本)。

授权

当任何身份验证提供者(见身份验证)已经证实still-unauthenticated令牌,将返回一个身份验证令牌。身份验证侦听器应该直接设置这个令牌SecurityContextInterface使用它的setToken ()方法。

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

一个授权决策总是基于几件事:

  • 当前令牌
    例如,令牌的将getRoles ()方法可用于获取当前用户的角色(如。ROLE_SUPER_ADMIN),或者决定的类可能是基于令牌。
  • 一组属性
    每个属性代表一个特定的用户应该有,例如ROLE_ADMIN以确保用户管理员。
  • 一个对象(可选)
    需要检查任何对象的访问控制,像一篇文章或评论对象。

访问决策管理器

自从决定用户是否被授权执行一定的动作可以是一个复杂的过程,标准AccessDecisionManager本身取决于多个选民,并使最终判决基于所有的选票(积极、消极或中性)已收到。它认识到几个策略:

肯定的(默认)
授权访问尽快有一个选民授予访问;
共识
授权访问如果有更多的选民比有拒绝授予访问;
一致
只有授权访问,如果所有的选民拒绝;
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
使用欧宝娱乐app下载地址\组件\安全\核心\授权\AccessDecisionManager;/ / Symfony实例组件\欧宝娱乐app下载地址 \安全\ \ \选民授权\ VoterInterface核心美元选民=数组(…);/ /“平权”之一,“共识”,“一致”美元策略=……;/ /是否授权访问当所有选民弃权美元allowIfAllAbstainDecisions=……;/ /是否授权访问当没有多数(仅适用于“共识”策略)美元allowIfEqualGrantedDeniedDecisions=……;美元accessDecisionManager=AccessDecisionManager (美元选民,美元策略,美元allowIfAllAbstainDecisions,美元allowIfEqualGrantedDeniedDecisions);

另请参阅

您可以更改默认的策略配置

选民

选民们的实例VoterInterface,这意味着他们必须实现一些方法决定经理可以使用它们:

supportsAttribute(属性)
将用于检查如果选民知道如何处理给定的属性;
supportsClass(类)
将用于检查如果选民能够授予或拒绝访问给定类的一个对象;
投票(令牌,美元TokenInterface对象,数组$属性)
该方法将实际投票和返回值等于1类的常量VoterInterface,即VoterInterface: ACCESS_GRANTED,VoterInterface: ACCESS_DENIEDVoterInterface: ACCESS_ABSTAIN;

安全组件包含一些标准选民涵盖许多用例:

AuthenticatedVoter

AuthenticatedVoter选民支持的属性IS_AUTHENTICATED_FULLY,IS_AUTHENTICATED_REMEMBERED,IS_AUTHENTICATED_ANONYMOUSLY和授予访问基于当前级别的认证,即是用户完全验证,或者只基于“记住我”饼干,甚至匿名身份验证?

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
使用欧宝娱乐app下载地址\组件\安全\核心\身份验证\AuthenticationTrustResolver;美元anonymousClass=S欧宝娱乐app下载地址ymfony的核心组件\ \安全\ \认证\牌\ AnonymousToken ';美元rememberMeClass=S欧宝娱乐app下载地址ymfony的核心组件\ \安全\ \认证\牌\ RememberMeToken ';美元trustResolver=AuthenticationTrustResolver (美元anonymousClass,美元rememberMeClass);美元authenticatedVoter=AuthenticatedVoter (美元trustResolver);/ / Symfony的实例组欧宝娱乐app下载地址件\ \安全\ \牌\ TokenInterface核心\身份验证美元令牌=……;/ /任何对象美元对象=……;美元投票=美元authenticatedVoter- >投票(美元令牌,美元对象,数组(“IS_AUTHENTICATED_FULLY”));

RoleVoter

RoleVoter支持属性入手具备ROLE_并向用户授予访问权限时必需的具备ROLE_ *属性都可以找到数组中返回的角色令牌的将getRoles ()方法:

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

RoleHierarchyVoter

RoleHierarchyVoter扩展RoleVoter并提供了一些额外的功能:它知道如何处理角色的层次结构。例如,一个ROLE_SUPER_ADMIN角色可能subrolesROLE_ADMINROLE_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”),);美元roleHierarchy=RoleHierarchy (美元层次结构);美元roleHierarchyVoter=RoleHierarchyVoter (美元roleHierarchy);

请注意

当你做你自己的选民,当然你可以用其构造函数注入任何依赖项需要来决定。

角色

角色是表达出一定的对象正确的用户。唯一的要求是他们实现RoleInterface,这意味着他们应该也有一个getRole ()角色本身的方法,该方法返回一个字符串表示。默认的角色仅返回第一个构造函数参数:

1 2 3 4 5 6
使用欧宝娱乐app下载地址\组件\安全\核心\角色\角色;美元角色=角色(“ROLE_ADMIN”);/ /将显示“ROLE_ADMIN”var_dump (美元角色- >getRole ());

请注意

大多数从身份验证令牌AbstractToken给它的构造函数,这意味着角色将自动从字符串到这些简单的转换角色对象。

使用决策管理器

访问侦听器

访问决策管理器可以在任何时候使用要求决定当前用户是否有权访问特定资源。一个可选的,但是有用,方法基于URL模式是限制访问AccessListener,这是一个防火墙听众(见防火墙和安全上下文),为每个请求触发匹配防火墙(见地图防火墙和安全上下文)。

它使用一个访问地图(这应该的一个实例AccessMapInterface)包含请求匹配器和一组相应的属性需要当前用户可以访问应用程序:

1 2 3 4 5 6 7 8 9 10 11 12 13 14
使用欧宝娱乐app下载地址\组件\安全\Http\AccessMap;使用欧宝娱乐app下载地址\组件\HttpFoundation\RequestMatcher;使用欧宝娱乐app下载地址\组件\安全\Http\防火墙\AccessListener;美元accessMap=AccessMap ();美元requestMatcher=RequestMatcher (“^ /管理”);美元accessMap- >add (美元requestMatcher,数组(“ROLE_ADMIN”));美元accessListener=AccessListener (美元securityContext,美元accessDecisionManager,美元accessMap,美元authenticationManager);

安全上下文

访问决策管理器也可以通过这个应用程序的其他部分isGranted ()的方法SecurityContext。调用这个方法将直接委托问题访问决策管理器:

1 2 3 4 5 6 7 8 9 10 11
使用欧宝娱乐app下载地址\组件\安全\SecurityContext;使用欧宝娱乐app下载地址\组件\安全\核心\异常\AccessDeniedException;美元securityContext=SecurityContext (美元authenticationManager,美元accessDecisionManager);如果(!美元securityContext- >isGranted (“ROLE_ADMIN”)){AccessDeniedException ();}
这项工作,包括代码示例,许可下Creative Commons冲锋队3.0许可证。