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

编辑本页

警告:您正在浏览的文档欧宝官网下载appob娱乐下载Symfony 2.8,现已不再维护。

本页的更新版本用于Syob娱乐下载mfony 6.2(当前稳定版本)。

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

在Syob娱乐下载mfony中,可以使用ACL模块,这对许多应用程序来说有点难以承受。一个更简单的解决方案是使用自定义投票人,它类似于简单的条件语句。

提示

看一下授权文章对选民有更深入的了解。

Symfob娱乐下载ony如何利用选民

为了利用选民,您必须了解Symfony如何与他们合作。ob娱乐下载的时候,所有的投票人都会被调用isGranted ()方法的授权检查器(即ob娱乐下载security.authorization_checker服务)。每一个都决定当前用户是否应该访问某些资源。

最终,Symfony从所ob娱乐下载有投票者那里获得反馈,并根据应用程序中定义的策略做出最终决定(允许或拒绝访问资源),可以是:肯定、一致或一致。

更多信息请看关于访问决策管理器的部分

选民界面

需要实现的自定义投票人VoterInterface或扩展选民,这使得创建投票者更加容易:

1 2 3 4 5
摘要选民实现了VoterInterface摘要受保护的函数支持属性主题摘要受保护的函数voteOnAttribute属性主题, TokenInterface令牌;}

2.8

选民helper类是在Symfony 2.8中添加的。ob娱乐下载在早期版本中,anAbstractVoter具有类似行为的类是可用的。

设置:检查控制器中的访问

假设你有一个帖子对象,您需要决定当前用户是否可以编辑视图对象。在你的控制器中,你会用这样的代码检查访问:

12 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
/ / src / AppBundle /控制器/ PostController.php/ /……为PostController扩展控制器/ * * *@Route("/posts/{id}", name="post_show") */公共函数showActionid//获取Post对象——例如查询它帖子=……;// check for "view" access:调用所有投票人->denyAccessUnlessGranted (“视图”帖子);/ /……/ * * *@Route("/posts/{id}/edit", name="post_edit") */公共函数editActionid//获取Post对象——例如查询它帖子=……;//检查“edit”权限:调用所有投票人->denyAccessUnlessGranted (“编辑”帖子);/ /……}}

denyAccessUnlessGranted ()方法(也是更简单的方法isGranted ()方法)调用“voter”系统。现在,没有选民会投票决定用户是否可以“查看”或“编辑”一个帖子.但是你可以创建你的自己的投票人用任何你想用的逻辑来决定。

提示

denyAccessUnlessGranted ()而且isGranted ()函数都是控制器要调用的类isGranted ()security.authorization_checker服务。主要的区别是,当不允许访问时,denyAccessUnlessGranted ()抛出一个AccessDeniedException,而isGranted ()返回

创建自定义投票人

假设决定用户是否可以“查看”或“编辑”a的逻辑帖子对象非常复杂。例如,用户可以随时编辑或查看帖子他们创造了。如果帖子被标记为“公共”,任何人都可以查看。这种情况下的投票者应该是这样的:

12 34 56 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 58 59 60 61 62 63 64 65 66 67 68 69 70 71
/ / src / AppBundle /安全/ PostVoter.php名称空间AppBundle安全使用AppBundle实体帖子使用AppBundle实体用户使用ob娱乐下载组件安全核心身份验证令牌TokenInterface使用ob娱乐下载组件安全核心授权选民选民PostVoter扩展选民//这些字符串只是被发明出来的:你可以使用任何东西常量视图=“视图”常量编辑=“编辑”受保护的函数支持属性主题//如果该属性不是我们支持的,返回false如果(!in_array (属性数组自我::看来,自我::编辑))){返回;}//只对该投票人内部的Post对象投票如果(!主题运算符Post) {返回;}返回真正的;}受保护的函数voteOnAttribute属性主题, TokenInterface令牌用户令牌->getUser ();如果(!用户运算符用户){//用户必须登录;如果不是,则拒绝访问返回;}//你知道$subject是Post对象,感谢支持/**@varPost $ Post */帖子主题开关属性){情况下自我::观点:返回->canView (帖子用户);情况下自我::编辑:返回->canEdit (帖子用户);}\ LogicException (“不能到达这个密码!”);}私人函数canView(文章帖子、用户用户//如果他们可以编辑,他们可以查看如果->canEdit (帖子用户)) {返回真正的;}// Post对象可以有一个方法isPrivate()//检查布尔值$private属性返回帖子->isPrivate ();}私人函数canEdit(文章帖子、用户用户//假设数据对象有一个getOwner()方法//获取拥有该数据对象的用户的实体返回用户===帖子->getOwner ();}}

就是这样!投票人完成了!接下来,配置它

概括一下,下面是对这两个抽象方法的期望:

选民::支持(属性、主题)美元
isGranted ()(或denyAccessUnlessGranted ())调用时,第一个参数在这里传递为美元的属性(如。ROLE_USER编辑),第二个参数(如果有的话)传递为美元的主题(如。,一个帖子对象)。您的工作是确定您的投票者是否应该对属性/主题组合进行投票。如果返回true,voteOnAttribute ()将被调用。否则,你的投票人已经完成了:其他投票人应该处理这个。在本例中,返回真正的如果属性为视图编辑如果物体是a帖子实例。
voteOnAttribute($attribute, $subject, TokenInterface $token)
如果你回来真正的支持(),则调用此方法。你的工作很简单:回来真正的允许访问和拒绝访问。的美元的令牌可用于查找当前用户对象(如果有的话)。在本例中,包含了所有复杂的业务逻辑以确定访问权限。

配置投票者

要将投票人注入安全层,必须将其声明为服务并标记为security.voter

  • YAML
  • XML
  • PHP
1 2 3 4 5 6 7 8
# app / config / services.yml服务:app.post_voter:类:AppBundle \安全\ PostVoter标签:-名称:security.voter#小的性能提升公众:

你已经完成了!现在,当你使用view/edit和Post对象调用isgranting (),您的投票人将被执行,您可以控制访问。

检查Voter中的角色

如果你想打电话怎么办isGranted ()内部您的选民-例如,您想要查看当前用户是否有ROLE_SUPER_ADMIN.的isGranted ()方法提供security.authorization_checker透过AccessDecisionManager类。但是,您不能注入该服务,因为它会导致CircularReferenceException

解决方案是注入service_container服务并使用它来获得security.authorization_checker服务和调用isGranted ()方法。

更改访问决策策略

通常情况下,在任何给定的时间内,只有一名选民会投票(其余的选民将“弃权”,这意味着他们将返回投票支持()).但在理论上,您可以让多个投票者投票支持一个动作和对象。例如,假设有一个投票人检查用户是否是站点的成员,另一个投票人检查用户是否超过18岁。

为了处理这些情况,访问决策管理器使用访问决策策略。您可以配置它以满足您的需要。有三种策略可供选择:

肯定的(默认)
一旦有机会,就会立即授予访问权限一个允许进入的投票人;
共识
如果允许访问的选民多于拒绝访问的选民,则允许访问;
一致
只有当没有选民拒绝访问时,才允许访问。如果所有选民都投了弃权票,则该决定以投票结果为依据allow_if_all_abstain配置选项(默认为).

在上面的场景中,两个投票人都应该授予访问权,以便授予用户阅读文章的访问权。在这种情况下,默认策略不再有效一致应该改为使用。你可以在安全配置中设置:

  • YAML
  • XML
  • PHP
1 2 3 4 5
# app / config / security.yml安全:access_decision_manager:策略:一致allow_if_all_abstain:
此工作,包括代码示例,是根据创作共用BY-SA 3.0许可证。