授权
编辑本页警告:您正在浏览的文档欧宝官网下载appob娱乐下载Symfony 2.8,现已不再维护。
读本页的更新版本用于Syob娱乐下载mfony 6.2(当前稳定版本)。
授权
当任何身份验证提供程序(请参阅身份验证)已经验证了尚未验证的令牌,则将返回一个已验证的令牌。对象中直接设置此令牌TokenStorageInterface使用它的setToken ()方法。
从那时起,对用户进行身份验证,即识别。现在,应用程序的其他部分可以使用令牌来决定用户是否可以请求某个URI或修改某个对象。这个决定将由一个实例做出AccessDecisionManagerInterface.
授权决策总是基于以下几点:
-
- 当前令牌
-
例如,令牌将getRoles ()方法可以用来检索当前用户的角色(例如。
ROLE_SUPER_ADMIN
),或者决定可能基于令牌的类别。
-
- 一组属性
-
每个属性代表用户应该拥有的某种权利,例如:
ROLE_ADMIN
确保用户是管理员。
-
- 对象(可选)
- 需要检查访问控制的任何对象,如文章或评论对象。
访问决策管理器
由于决定用户是否被授权执行某个操作可能是一个复杂的过程,因此标准AccessDecisionManager它本身取决于多个投票者,并根据它所获得的所有选票(积极、消极或中立)做出最终裁决。它识别了几种策略:
-
肯定的
(默认) - 只要有一个选民批准访问,就授予访问权限;
-
共识
- 如果允许进入的选民多于拒绝进入的选民,则允许进入;
-
一致
- 只有在没有选民拒绝访问时才允许访问;
12 3 4 5 6 7 8 9 10 11 12 13 14 16 17 18 19 20
使用ob娱乐下载\组件\安全\核心\授权\AccessDecisionManager;// Symfony\Compoob娱乐下载nent\Security\Core\Authorization\Voter\VoterInterface的实例$选民=数组(…);// " positive ", "consensus", "unanimous"中的一个$策略=……;//当所有选民弃权时,是否允许进入$allowIfAllAbstainDecisions=……;//当没有多数意见时是否授予访问权限(只适用于“协商一致”策略)$allowIfEqualGrantedDeniedDecisions=……;$accessDecisionManager=新AccessDecisionManager ($选民,$策略,$allowIfAllAbstainDecisions,$allowIfEqualGrantedDeniedDecisions);
另请参阅
中更改默认策略配置.
选民
选民是VoterInterface,这意味着他们必须实现一些方法,允许决策管理器使用它们:
-
supportsAttribute(属性)
(2.8已弃用) - 将用于检查投票人是否知道如何处理给定的属性;
-
supportsClass(类)
(2.8已弃用) - 将用于检查投票人是否能够授予或拒绝对给定类的对象的访问;
-
投票(TokenInterface $token, $object,数组$attributes)
-
的类常量之一,此方法将执行实际投票并返回值VoterInterface,即
VoterInterface: ACCESS_GRANTED
,VoterInterface: ACCESS_DENIED
或VoterInterface: ACCESS_ABSTAIN
;
请注意
的supportsAttribute ()
而且supportsClass ()
方法在Symfony 2.8中已弃用,在3.0中不再需要。ob娱乐下载这些方法不应该在voter类之外调用。
Security组件包含了一些标准投票者,涵盖了很多用例:
AuthenticatedVoter
的AuthenticatedVoter投票人支持属性IS_AUTHENTICATED_FULLY
,IS_AUTHENTICATED_REMEMBERED
,IS_AUTHENTICATED_ANONYMOUSLY
并根据当前认证级别授予访问权限,即用户是完全认证,还是仅基于“记住我”cookie,甚至匿名认证?
12 3 4 5 6 7 8 9 10 11 12 13 14 15
使用ob娱乐下载\组件\安全\核心\身份验证\AuthenticationTrustResolver;使用ob娱乐下载\组件\安全\核心\身份验证\令牌\AnonymousToken;使用ob娱乐下载\组件\安全\核心\身份验证\令牌\RememberMeToken;$trustResolver=新AuthenticationTrustResolver (AnonymousToken::类,RememberMeToken::类);$authenticatedVoter=新AuthenticatedVoter ($trustResolver);// Symfony\Compob娱乐下载onent\Security\Core\Authentication\Token\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并提供了一些额外的功能:它知道如何处理角色的层次结构。例如,aROLE_SUPER_ADMIN
角色可以有子角色ROLE_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'var_dump ($角色->getRole ());
请注意
大多数身份验证令牌从AbstractToken,这意味着赋予其构造函数的角色将自动从字符串转换为这些简单的角色
对象。
使用决策管理器
访问监听器
访问决策管理器可以在请求中的任何位置使用,以决定当前用户是否有权访问给定的资源。基于URL模式限制访问的一种可选但有用的方法是AccessListener,它是防火墙侦听器之一(请参阅防火墙与授权),它会为每个匹配防火墙映射的请求触发(请参见防火墙与授权).
它使用访问映射(应该是的实例)AccessMapInterface),其中包含请求匹配器和当前用户访问应用程序所需的相应属性集:
12 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 ()方法AuthorizationChecker.调用此方法将直接将问题委托给访问决策管理器:
12 3 4 5 6 7 8 9 10 11 12
使用ob娱乐下载\组件\安全\核心\授权\AuthorizationChecker;使用ob娱乐下载\组件\安全\核心\异常\AccessDeniedException;$authorizationChecker=新AuthorizationChecker ($tokenStorage,$authenticationManager,$accessDecisionManager);如果(!$authorizationChecker->isGranted (“ROLE_ADMIN”)) {扔新AccessDeniedException ();}