如何使用选民来检查用户的权限
编辑该页面警告:你浏览的文档欧宝官网下载appob娱乐下载Symfony 2.6,不再维护。
读这个页面的更新版本Symfob娱乐下载ony 6.2(当前的稳定版本)。
如何使用选民来检查用户的权限
在Syob娱乐下载mfony中,您可以检查使用权限访问数据ACL模块许多应用程序,这有点势不可挡。一个更简单的解决方案是使用定制选民,类似于简单的条件语句。
另请参阅
选民也可以用于其他方面,例如,黑名单IP地址从整个应用程序:如何使用选民来检查用户的权限。
提示
看一看授权章在选民们更深入的理解。
Symfob娱乐下载ony如何使用选民
为了使用选民,你必须理解Symfony是如何工作的。ob娱乐下载所有选民被称为每次使用isGranted ()
在Symfony的授ob娱乐下载权检查器(即方法security.authorization_checker
服务)。每一个决定如果当前用户可以访问一些资源。
最终,Symfony将所ob娱乐下载有选民的反应,使最终的啥子(允许或拒绝访问资源)根据应用程序中定义的策略,可以:肯定的,或一致的共识。
看一看的更多信息部分的访问决策管理器。
选民的接口
一个定制的选民需要实现VoterInterface或扩展AbstractVoter,这使得创建一个选民更容易。
1 2 3 4 5 6
文摘类AbstractVoter实现了VoterInterface{文摘受保护的函数getSupportedClasses();文摘受保护的函数getSupportedAttributes();文摘受保护的函数isGranted(美元属性,美元对象,美元用户= null);}
在这个例子中,选民将会检查用户是否有权访问一个特定的对象根据您的自定义条件(例如,他们必须对象)的所有者。如果条件失败,你会回来VoterInterface: ACCESS_DENIED
,否则你会回来VoterInterface: ACCESS_GRANTED
。如果这个决定的责任不属于这个选民,它将返回VoterInterface: ACCESS_ABSTAIN
。
创建定制的选民
我们的目标是创建一个选民,检查用户是否有权访问查看或编辑一个特定的对象。这里有一个例子实现:
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日26日27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50
/ / src / AppBundle /安全/授权/选民/ PostVoter.php名称空间AppBundle\安全\授权\选民;使用ob娱乐下载\组件\安全\核心\授权\选民\AbstractVoter;使用ob娱乐下载\组件\安全\核心\用户\用户界面;类PostVoter扩展AbstractVoter{常量视图=“视图”;常量编辑=“编辑”;受保护的函数getSupportedAttributes(){返回数组(自我::看来,自我::编辑);}受保护的函数getSupportedClasses(){返回数组(“AppBundle \实体\职位”);}受保护的函数isGranted(美元属性,美元帖子,美元用户= null){/ /确保有一个用户对象(即用户登录)如果(!美元用户运算符用户界面){返回假;}开关(美元属性){情况下自我::观点:/ /数据对象可以例如isPrivate方法()/ /检查布尔属性私人美元如果(!美元帖子- >isPrivate ()) {返回真正的;}打破;情况下自我::编辑:/ /这个假设数据对象getOwner()方法/ /获取用户拥有该数据对象的实体如果(美元用户- >getId () = = =美元帖子- >getOwner ()- >getId ()) {返回真正的;}打破;}返回假;}}
就是这样!选民就完成了。下一步是注入选民的安全层。
回顾一下,这就是预期的三个抽象方法:
- getSupportedClasses ()
-
它告诉Symfonob娱乐下载y的选民应该被称为当一个对象被传递给一个给定的类
isGranted ()
。例如,如果您回来阵列(AppBundle \ \产品模型)
,Sob娱乐下载ymfony会叫你的选民产品
对象传递给isGranted ()
。 - getSupportedAttributes ()
-
它告诉Symfonob娱乐下载y,你的选民应该叫做每当这些字符串之一是作为第一个参数传递
isGranted ()
。例如,如果您回来阵列(“创造”,“读”)
,Symfonob娱乐下载y将打电话给你当其中之一就是传递给选民isGranted ()
。 - isGranted ()
-
它实现了业务逻辑验证是否一个给定的用户被允许访问一个给定的属性(如。
创建
或读
)在一个给定的对象。该方法必须返回一个布尔值。
请注意
目前,使用AbstractVoter
基类,您必须创建一个选民总是传递给一个对象isGranted ()
。
宣称选民作为服务
安全层注入选民,你必须声明它作为服务和标记security.voter
:
- YAML
- XML
- PHP
1 2 3 4 5 6 7
# app / config / services.yml服务:security.access.post_voter:类:AppBundle \安全\ \选民\ PostVoter授权公众:假标签:- - - - - -{名称:security.voter}
如何使用一个控制器的选民
注册选民将总是被要求尽快方法isGranted ()
从授权检查。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
/ / src / AppBundle /控制器/ PostController.php名称空间AppBundle\控制器;使用ob娱乐下载\包\FrameworkBundle\控制器\控制器;使用ob娱乐下载\组件\HttpFoundation\响应;类为PostController扩展控制器{公共函数showAction(美元id){/ /得到一个实例美元帖子=……;美元authChecker=美元这- >get (“security.authorization_checker”);美元这- >denyAccessUnlessGranted (“视图”,美元帖子,“未经授权的访问!”);返回新响应(“< h1 >”。美元帖子- >getName ()。“< / h1 >”);}}
2.6
的security.authorization_checker
服务是在Symfony 2.6中引入的。ob娱乐下载Symfony 2ob娱乐下载.6之前,您必须使用isGranted ()
的方法security.context
服务。
它是那么容易!
改变访问决策策略
想象你有多个选民为对象的一个动作。例如,你有一个选民,检查如果用户是网站的一员和第二个检查如果用户年龄超过18岁。
处理这些情况下,访问决策管理器使用一个访问决策策略。您可以配置适合您的需求。有三种策略:
-
肯定的
(默认) - 这就授予访问权限一个选民授予访问;
-
共识
- 授予访问权限如果有更多的选民比拒绝授予访问;
-
一致
- 这只授予访问权限所有选民授权访问。
在上面的场景中,选民应该授权访问以授权访问用户读过了那篇文章。在这种情况下,默认的战略不再有效一致
应该使用。你可以设置在安全配置:
- YAML
- XML
- PHP
1 2 3 4
# app / config / security.yml安全:access_decision_manager:策略:一致