如何使用选民来检查用户的权限

编辑该页面

警告:你浏览的文档欧宝官网下载appob娱乐下载Symfony 2.7,不再维护。

这个页面的更新版本Symfob娱乐下载ony 6.2(当前的稳定版本)。

如何使用选民来检查用户的权限

在Syob娱乐下载mfony中,您可以检查使用权限访问数据ACL模块许多应用程序,这有点势不可挡。一个更简单的解决方案是使用定制选民,类似于简单的条件语句。

提示

看一看授权文章对选民们更深入的理解。

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 51 52 53 54 55 56 57
/ / src / AppBundle /安全/授权/选民/ PostVoter.php名称空间AppBundle\安全\授权\选民;使用ob娱乐下载\组件\安全\核心\授权\选民\AbstractVoter;使用AppBundle\实体\用户;使用ob娱乐下载\组件\安全\核心\用户\用户界面;PostVoter扩展AbstractVoter{常量视图=“视图”;常量编辑=“编辑”;受保护的函数getSupportedAttributes(){返回数组(自我::看来,自我::编辑);}受保护的函数getSupportedClasses(){返回数组(“AppBundle \实体\职位”);}受保护的函数isGranted(美元属性,美元帖子,美元用户= null){/ /确保有一个用户对象(即用户登录)如果(!美元用户运算符用户界面){返回;}/ /检查用户对象(这是预期的实体/ /只有当你没有正确地配置安全系统)如果(!美元用户运算符用户){\ LogicException (“用户是没有我们的用户类!”);}开关(美元属性){情况下自我::观点:/ /数据对象可以例如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 ()从授权检查。当扩展基础控制器类,您可以简单地调用denyAccessUnlessGranted ()方法:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
/ / src / AppBundle /控制器/ PostController.php名称空间AppBundle\控制器;使用ob娱乐下载\\FrameworkBundle\控制器\控制器;使用ob娱乐下载\组件\HttpFoundation\响应;为PostController扩展控制器{公共函数showAction(美元id){/ /得到一个实例美元帖子=……;/ /记住,这将调用所有注册安全选民美元- >denyAccessUnlessGranted (“视图”,美元帖子,“未经授权的访问!”);返回响应(“< h1 >”美元帖子- >getName ()。“< / h1 >”);}}

2.6

denyAccessUnlessGranted ()方法是在Symfony 2.6中引入的。ob娱乐下载Symfony 2ob娱乐下载.6之前,你必须调用isGranted ()的方法security.context服务和自己抛出的异常。

它是那么容易!

改变访问决策策略

想象你有多个选民为对象的一个动作。例如,你有一个选民,检查如果用户是网站的一员和第二个检查如果用户年龄超过18岁。

处理这些情况下,访问决策管理器使用一个访问决策策略。您可以配置适合您的需求。有三种策略:

肯定的(默认)
这就授予访问权限一个选民授予访问;
共识
授予访问权限如果有更多的选民比拒绝授予访问;
一致
这只授予访问权限,如果没有选民拒绝访问。如果所有选民弃权投票,这个决定是基于allow_if_all_abstain配置选项(默认值)。

在上面的场景中,选民应该授权访问以授权访问用户读过了那篇文章。在这种情况下,默认的战略不再有效一致应该使用。你可以设置在安全配置:

  • YAML
  • XML
  • PHP
1 2 3 4 5
# app / config / security.yml安全:access_decision_manager:策略:一致allow_if_all_abstain:
这项工作,包括代码示例,许可下Creative Commons冲锋队3.0许可证。