Symfonyob娱乐下载 2.6新增功能:更简单的安全投票者
2014年9月29日·发表的哈维尔Eguiluz
警告:这篇文章是关于一个不受支持的Symfony版本。ob娱乐下载有些信息可能已经过时了。阅读最新的Symfony文档ob娱乐下载.
提供的
罗马Marintšenko而且瑞安·韦弗在# 11183.
安全的选民提供了一种在Symfony应用程序中设置细粒度限制的机制。ob娱乐下载主要优势在于acl它们更容易设置,配置和使用。
在以前的Symfony版ob娱乐下载本中,投票者实现了VoterInterface
接口,具有如下签名:
1 2 3 4 5 6
接口VoterInterface{公共函数supportsAttribute($属性);公共函数supportsClass($类);公共函数投票(TokenInterface$令牌,$对象数组,$属性);}
实现这个接口非常容易,但结果代码通常有点臃肿,如下面的83行代码所示,需要定义一个简单的voter:
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 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83
/ / src / Acme / DemoBundle /安全/授权/选民/ PostVoter.php名称空间Acme\DemoBundle\安全\授权\选民;使用ob娱乐下载\组件\安全\核心\授权\选民\VoterInterface;使用ob娱乐下载\组件\安全\核心\身份验证\令牌\TokenInterface;使用ob娱乐下载\组件\安全\核心\用户\用户界面;类PostVoter实现了VoterInterface{常量视图=“视图”;常量编辑=“编辑”;公共函数supportsAttribute($属性){返回in_array ($属性,数组(自我::看来,自我::编辑);}公共函数supportsClass($类){$supportedClass=“Acme \ DemoBundle \实体\职位”;返回$supportedClass= = =$类| | is_subclass_of ($类,$supportedClass);}/ * * *@var\Acme\DemoBundle\Entity\Post $ Post */公共函数投票(TokenInterface$令牌,$帖子数组,$属性){//检查这个投票人是否支持这个对象的类如果(!$这->supportsClass (get_class ($帖子))) {返回VoterInterface::ACCESS_ABSTAIN;}//检查投票人是否使用正确,只允许一个属性//这不是一个要求,这只是一个简单的方法//设计你的选民如果(1! = = count ($属性)) {扔新\ InvalidArgumentException (“VIEW或EDIT只允许一个属性”);}//设置属性来检查$属性=$属性[0];//检查给定属性是否被该投票人覆盖如果(!$这->supportsAttribute ($属性)) {返回VoterInterface::ACCESS_ABSTAIN;}//获取当前登录用户$用户=$令牌->getUser ();//确保有一个用户对象(即用户已经登录)如果(!$用户运算符用户界面){返回VoterInterface::ACCESS_DENIED;}开关($属性) {情况下自我::观点://数据对象可以有一个方法isPrivate()//检查Boolean属性$private如果(!$帖子->isPrivate ()) {返回VoterInterface::ACCESS_GRANTED;}打破;情况下自我::编辑://我们假设我们的数据对象有一个方法getOwner()//获取该数据对象的当前所有者用户实体如果($用户->getId () = = =$帖子->getOwner ()->getId ()) {返回VoterInterface::ACCESS_GRANTED;}打破;}返回VoterInterface::ACCESS_DENIED;}}
作为的结果ob娱乐下载Symfony DX倡议,ob娱乐下载Symfony 2.6允许定义更简单的安全投票者.要做到这一点,使用新的AbstractVoter
类,它实现VoterInterface
并定义了以下方法:
1 2 3 4 5 6 7 8 9
摘要类AbstractVoter实现了VoterInterface{公共函数supportsAttribute($属性);公共函数supportsClass($类);公共函数投票(TokenInterface$令牌,$对象数组,$属性);摘要受保护的函数getSupportedClasses();摘要受保护的函数getSupportedAttributes();摘要受保护的函数isGranted($属性,$对象,$用户= null);}
三种方法supportsAttribute ()
,supportsClass ()
而且投票()
帮助您减少投票者的样板代码,并让您专注于应用程序的特定业务逻辑。结果,上面显示的同一个投票人现在只需要41行代码:
12 34 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
/ / src / Acme / DemoBundle /安全/授权/选民/ PostVoter.php名称空间Acme\DemoBundle\安全\授权\选民;使用ob娱乐下载\组件\安全\核心\授权\选民\AbstractVoter;使用ob娱乐下载\组件\安全\核心\用户\用户界面;类PostVoter扩展AbstractVoter{常量视图=“视图”;常量编辑=“编辑”;受保护的函数getSupportedAttributes(){返回数组(自我::看来,自我::编辑);}受保护的函数getSupportedClasses(){返回数组(“Acme \ DemoBundle \实体\职位”);}受保护的函数isGranted($属性,$帖子,$用户= null){//确保有一个用户对象(即用户已经登录)如果(!$用户运算符用户界面){返回假;}//决定给定用户是否可以查看的自定义业务逻辑//和/或编辑给定的帖子如果($属性= =自我::查看&& !$帖子->isPrivate ()) {返回真正的;}如果($属性= =自我::编辑& &$用户->getId () = = =$帖子->getOwner ()->getId ()) {返回真正的;}返回假;}}
编写更少的代码来获得与以前相同的结果可以提高您的工作效率。这是我们自DX倡议推出以来的执着,Symfony 2.6将是第一个拥抱这种新理念的版本。ob娱乐下载
发表在#生活在边缘
评论
评论截止。
为了确保评论保持相关性,旧帖子将被关闭。
+1000点DX主动。
一个问题:在决定一个项目是否允许显示在列表中(即管理中的项目列表)时,如何将业务逻辑放入决策中?我永远不会在foreach循环中执行isgranting()。但是有什么机制计划吗?
在我目前的项目中,我实现了一个非常接近选民的机制。通过SonataAdmin的帮助,我可以访问创建列表的查询。因此,构建一个带有“queryHelpers”标签的循环工厂,它具有与投票者相同的界面。而不是投票,他们只是减少/操纵查询。
我知道这个方法需要更多的抽象,但如果有人有兴趣看到更多的细节,我会打开一个RFC。
由于在投票之前管理器不会调用这些方法,所以必须在投票方法本身中复制(或至少编写额外的)代码。
如果不支持属性或对象,只需从vote方法返回VoterInterface::ACCESS_ABSTAIN。此外,有时类还不足以决定——你需要对象本身。
总之,我认为这个抽象投票者可以拥有这些方法的默认实现,因为在Symfony标准中实际上并没有调用它们。ob娱乐下载