授权
编辑本页警告:您正在浏览的文档欧宝官网下载appob娱乐下载Symfony 4.4,现已不再维护。
读本页的更新版本用于Syob娱乐下载mfony 6.2(当前稳定版本)。
授权
当任何身份验证提供程序(请参阅身份验证)已经验证了尚未验证的令牌,则将返回一个已验证的令牌。对象中直接设置此令牌TokenStorageInterface使用它的setToken ()方法。
从那时起,对用户进行身份验证,即识别。现在,应用程序的其他部分可以使用令牌来决定用户是否可以请求某个URI或修改某个对象。这个决定将由一个实例做出AccessDecisionManagerInterface.
授权决策总是基于以下几点:
-
- 当前令牌
-
例如,令牌将getRoles ()方法可以用来检索当前用户的角色(例如。
ROLE_SUPER_ADMIN
),或者决定可能基于令牌的类别。
-
- 一组属性
-
每个属性代表用户应该拥有的某种权利,例如:
ROLE_ADMIN
确保用户是管理员。
-
- 对象(可选)
- 需要检查访问控制的任何对象,如文章或评论对象。
访问决策管理器
由于决定用户是否被授权执行某个操作可能是一个复杂的过程,因此标准AccessDecisionManager它本身取决于多个投票者,并根据它所获得的所有选票(积极、消极或中立)做出最终裁决。它识别了几种策略:
-
肯定的
(默认) - 只要有一个选民批准访问,就授予访问权限;
-
共识
- 如果允许进入的选民多于拒绝进入的选民,则允许进入;
-
一致
-
只有在没有选民拒绝的情况下才允许进入。如果所有选民都投了弃权票,则该决定以投票结果为依据
allow_if_all_abstain
配置选项(默认为假
).
可用选项的详细用法:
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,这意味着他们必须实现一些方法,允许决策管理器使用它们:
-
投票(TokenInterface $token, $subject,数组$attributes)
-
的类常量之一,此方法将执行实际投票并返回值VoterInterface,即
VoterInterface: ACCESS_GRANTED
,VoterInterface: ACCESS_DENIED
或VoterInterface: ACCESS_ABSTAIN
;
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
使用ob娱乐下载\组件\安全\核心\身份验证\AuthenticationTrustResolver;$trustResolver=新AuthenticationTrustResolver ();$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);
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
使用ob娱乐下载\组件\ExpressionLanguage\表达式;使用ob娱乐下载\组件\安全\核心\授权\选民\ExpressionVoter;/ /ob娱乐下载 Symfony核心组件\ \安全\ \ \ ExpressionLanguage授权;$expressionLanguage=……;// Symfony\Compob娱乐下载onent\Security\Core\Authentication\AuthenticationTrustResolverInterface实例$trustResolver=……;/ /ob娱乐下载 Symfony \ \安全\ \授权\ AuthorizationCheckerInterface核心组件$authorizationChecker=……;$expressionVoter=新ExpressionVoter ($expressionLanguage,$trustResolver,$authorizationChecker);// Symfony\Compob娱乐下载onent\Security\Core\Authentication\Token\TokenInterface实例$令牌=……;//任意对象$对象=……;$表达式=新表达式(' '角色中的' ROLE_ADMIN '或(不是is_anonymous()和user.isSuperAdmin())');$投票=$expressionVoter->投票($令牌,$对象, ($表达式]);
请注意
当您创建自己的投票人时,您可以使用它的构造函数注入它做出决定所需的任何依赖项。
角色
角色是表示用户所拥有的特定权限的字符串。“编辑博客文章”,“创建发票”).你可以自由选择这些弦。唯一的要求是他们必须从具备ROLE_
前缀(例如。ROLE_POST_EDIT
,ROLE_INVOICE_CREATE
).
使用决策管理器
访问监听器
访问决策管理器可以在请求中的任何位置使用,以决定当前用户是否有权访问给定的资源。基于URL模式限制访问的一种可选但有用的方法是AccessListener,它是防火墙侦听器之一(请参阅防火墙与授权),它会为每个匹配防火墙映射的请求触发(请参见防火墙与授权).
它使用访问映射(应该是的实例)AccessMapInterface),其中包含请求匹配器和当前用户访问应用程序所需的相应属性集:
12 3 4 5 6 7 8 9 10 11 12 13 14 15 16
使用ob娱乐下载\组件\HttpFoundation\RequestMatcher;使用ob娱乐下载\组件\安全\核心\身份验证\令牌\存储\TokenStorage;使用ob娱乐下载\组件\安全\Http\AccessMap;使用ob娱乐下载\组件\安全\Http\防火墙\AccessListener;$accessMap=新AccessMap ();$tokenStorage=新TokenStorage ();$requestMatcher=新RequestMatcher (“^ /管理”);$accessMap->add ($requestMatcher, (“ROLE_ADMIN”]);$accessListener=新AccessListener ($tokenStorage,$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 ();}