授权
编辑该页面警告:你浏览的文档欧宝官网下载appob娱乐下载Symfony 2.4,不再维护。
读这个页面的更新版本Symfob娱乐下载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
使用ob娱乐下载\组件\安全\核心\授权\AccessDecisionManager;/ / Symfony实例组件\ob娱乐下载 \安全\ \ \选民授权\ VoterInterface核心美元选民=数组(…);/ /“平权”之一,“共识”,“一致”美元策略=……;/ /是否授权访问当所有选民弃权美元allowIfAllAbstainDecisions=……;/ /是否授权访问当没有多数(仅适用于“共识”策略)美元allowIfEqualGrantedDeniedDecisions=……;美元accessDecisionManager=新AccessDecisionManager (美元选民,美元策略,美元allowIfAllAbstainDecisions,美元allowIfEqualGrantedDeniedDecisions);
另请参阅
您可以更改默认的策略配置。
选民
选民们的实例VoterInterface,这意味着他们必须实现一些方法决定经理可以使用它们:
-
-
supportsAttribute(属性)
- 将用于检查如果选民知道如何处理给定的属性;
-
-
-
supportsClass(类)
- 将用于检查如果选民能够授予或拒绝访问给定类的一个对象;
-
-
-
投票(令牌,美元TokenInterface对象,数组$属性)
-
该方法将实际投票和返回值等于1类的常量VoterInterface,即
VoterInterface: ACCESS_GRANTED
,VoterInterface: ACCESS_DENIED
或VoterInterface: 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
使用ob娱乐下载\组件\安全\核心\身份验证\AuthenticationTrustResolver;美元anonymousClass=Sob娱乐下载ymfony的核心组件\ \安全\ \认证\牌\ AnonymousToken ';美元rememberMeClass=Sob娱乐下载ymfony的核心组件\ \安全\ \认证\牌\ RememberMeToken ';美元trustResolver=新AuthenticationTrustResolver (美元anonymousClass,美元rememberMeClass);美元authenticatedVoter=新AuthenticatedVoter (美元trustResolver);/ / Symfony的实例组ob娱乐下载件\ \安全\ \牌\ TokenInterface核心\身份验证美元令牌=……;/ /任何对象美元对象=……;美元投票=美元authenticatedVoter- >投票(美元令牌,美元对象,数组(“IS_AUTHENTICATED_FULLY”);
RoleVoter
的RoleVoter支持属性入手具备ROLE_
并向用户授予访问权限时必需的具备ROLE_ *
属性都可以找到数组中返回的角色令牌的将getRoles ()方法:
1 2 3 4 5
使用ob娱乐下载\组件\安全\核心\授权\选民\RoleVoter;美元roleVoter=新RoleVoter (“具备ROLE_”);美元roleVoter- >投票(美元令牌,美元对象,数组(“ROLE_ADMIN”));
RoleHierarchyVoter
的RoleHierarchyVoter扩展RoleVoter并提供了一些额外的功能:它知道如何处理角色的层次结构。例如,一个ROLE_SUPER_ADMIN
角色可能subrolesROLE_ADMIN
和ROLE_USER
,这样当需要用户有一定的对象ROLE_ADMIN
作用,它授予访问权限的用户实际上有ROLE_ADMIN
用户角色,但也有ROLE_SUPER_ADMIN
角色:
1 2 3 4 5 6 7 8 9 10
使用ob娱乐下载\组件\安全\核心\授权\选民\RoleHierarchyVoter;使用ob娱乐下载\组件\安全\核心\角色\RoleHierarchy;美元层次结构=数组(“ROLE_SUPER_ADMIN”= >数组(“ROLE_ADMIN”,“ROLE_USER”),);美元roleHierarchy=新RoleHierarchy (美元层次结构);美元roleHierarchyVoter=新RoleHierarchyVoter (美元roleHierarchy);
请注意
当你做你自己的选民,当然你可以用其构造函数注入任何依赖项需要来决定。
角色
角色是表达出一定的对象正确的用户。唯一的要求是他们实现RoleInterface,这意味着他们应该也有一个getRole ()角色本身的方法,该方法返回一个字符串表示。默认的角色仅返回第一个构造函数参数:
1 2 3 4 5 6
使用ob娱乐下载\组件\安全\核心\角色\角色;美元角色=新角色(“ROLE_ADMIN”);/ /将回声“ROLE_ADMIN”回声美元角色- >getRole ();
请注意
大多数从身份验证令牌AbstractToken给它的构造函数,这意味着角色将自动从字符串到这些简单的转换角色
对象。
使用决策管理器
访问侦听器
访问决策管理器可以在任何时候使用要求决定当前用户是否有权访问特定资源。一个可选的,但是有用,方法基于URL模式是限制访问AccessListener,这是一个防火墙听众(见防火墙和安全上下文),为每个请求触发匹配防火墙(见地图防火墙和安全上下文)。
它使用一个访问地图(这应该的一个实例AccessMapInterface)包含请求匹配器和一组相应的属性需要当前用户可以访问应用程序:
1 2 3 4 5 6 7 8 9 10 11 12 13 14
使用ob娱乐下载\组件\安全\Http\AccessMap;使用ob娱乐下载\组件\HttpFoundation\RequestMatcher;使用ob娱乐下载\组件\安全\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
使用ob娱乐下载\组件\安全\SecurityContext;使用ob娱乐下载\组件\安全\核心\异常\AccessDeniedException;美元securityContext=新SecurityContext (美元authenticationManager,美元accessDecisionManager);如果(!美元securityContext- >isGranted (“ROLE_ADMIN”)){扔新AccessDeniedException ();}