授权
编辑该页面警告:你浏览的文档欧宝官网下载appob娱乐下载Symfony 5.0,不再维护。
读这个页面的更新版本Symfob娱乐下载ony 6.2(当前的稳定版本)。
授权
当任何身份验证提供者(见身份验证)已经证实still-unauthenticated令牌,将返回一个身份验证令牌。身份验证侦听器应该直接设置这个令牌TokenStorageInterface使用它的setToken ()方法。
从那时起,用户身份验证,即确定。现在,应用程序的其他部分可以使用令牌来决定是否用户可以请求特定的URI,或修改一个特定的对象。这一决定将由一个实例AccessDecisionManagerInterface。
一个授权决策总是基于几件事:
-
- 当前令牌
-
例如,令牌的getRoleNames ()方法可用于获取当前用户的角色(如。
ROLE_SUPER_ADMIN
),或者决定的类可能是基于令牌。
-
- 一组属性
-
每个属性代表一个特定的用户应该有,例如
ROLE_ADMIN
以确保用户管理员。
-
- 一个对象(可选)
- 需要检查任何对象的访问控制,像一篇文章或评论对象。
访问决策管理器
自从决定用户是否被授权执行一定的动作可以是一个复杂的过程,标准AccessDecisionManager本身取决于多个选民,并使最终判决基于所有的选票(积极、消极或中性)已收到。它认识到几个策略:
-
肯定的
(默认) - 授权访问尽快有一个选民授予访问;
-
共识
- 授权访问如果有更多的选民比有拒绝授予访问;
-
一致
-
只有授权访问,如果所有的选民拒绝访问。如果所有选民弃权投票,这个决定是基于
allow_if_all_abstain
配置选项(默认值假
)。
使用可用选项的细节:
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,这意味着他们必须实现一些方法决定经理可以使用它们:
-
投票(令牌,美元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
使用ob娱乐下载\组件\安全\核心\身份验证\AuthenticationTrustResolver;美元trustResolver=新AuthenticationTrustResolver ();美元authenticatedVoter=新AuthenticatedVoter (美元trustResolver);/ / Symfony的实例组ob娱乐下载件\ \安全\ \牌\ TokenInterface核心\身份验证美元令牌=……;/ /任何对象美元对象=……;美元投票=美元authenticatedVoter- >投票(美元令牌,美元对象,(“IS_AUTHENTICATED_FULLY”]);
RoleVoter
的RoleVoter支持属性入手具备ROLE_
并向用户授予访问权限时需要至少一个具备ROLE_ *
角色的属性数组中可以找到返回的令牌getRoleNames ()方法:
1 2 3 4 5
使用ob娱乐下载\组件\安全\核心\授权\选民\RoleVoter;美元roleVoter=新RoleVoter (“具备ROLE_”);美元roleVoter- >投票(美元令牌,美元对象,(“ROLE_ADMIN”]);
RoleHierarchyVoter
的RoleHierarchyVoter扩展RoleVoter并提供了一些额外的功能:它知道如何处理角色的层次结构。例如,一个ROLE_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组件。这些表达式获得很多特别安全变量:
1 2 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的实例\ob娱乐下载 \安全\ \认证\ AuthenticationTrustResolverInterface核心组件美元trustResolver=……;/ /ob娱乐下载 Symfony \ \安全\ \授权\ AuthorizationCheckerInterface核心组件美元authorizationChecker=……;美元expressionVoter=新ExpressionVoter (美元expressionLanguage,美元trustResolver,美元authorizationChecker);/ / Symfony的实例组ob娱乐下载件\ \安全\ \牌\ TokenInterface核心\身份验证美元令牌=……;/ /任何对象美元对象=……;美元表达式=新表达式(“ROLE_ADMIN”role_names或(不是is_anonymous()和user.isSuperAdmin ())”)美元投票=美元expressionVoter- >投票(美元令牌,美元对象,(美元表达式]);
请注意
当你做你自己的选民,您可以使用它的构造函数注入任何依赖项需要来决定。
角色
角色的字符串表达一定正确的用户(例如“编辑博客”,“创建发票”)。你可以自由选择这些字符串。唯一的要求就是,他们必须开始具备ROLE_
前缀(例如。ROLE_POST_EDIT
,ROLE_INVOICE_CREATE
)。
使用决策管理器
访问侦听器
访问决策管理器可以在任何时候使用要求决定当前用户是否有权访问特定资源。一个可选的,但是有用,方法基于URL模式是限制访问AccessListener,这是一个防火墙听众(见防火墙和授权),为每个请求触发匹配防火墙(见地图防火墙和授权)。
它使用一个访问地图(这应该的一个实例AccessMapInterface)包含请求匹配器和一组相应的属性需要当前用户可以访问应用程序:
1 2 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。调用这个方法将直接委托问题访问决策管理器:
1 2 3 4 5 6 7 8 9 10 11 12
使用ob娱乐下载\组件\安全\核心\授权\AuthorizationChecker;使用ob娱乐下载\组件\安全\核心\异常\AccessDeniedException;美元authorizationChecker=新AuthorizationChecker (美元tokenStorage,美元authenticationManager,美元accessDecisionManager);如果(!美元authorizationChecker- >isGranted (“ROLE_ADMIN”)){扔新AccessDeniedException ();}