新在Symfo欧宝娱乐app下载地址ny 2.6:简单安全的选民
2014年9月29日,·发表的哈维尔Eguiluz
警告:这篇文章是关于一个不受支持的Symfony的版本。欧宝娱乐app下载地址其中一些信息可能是过时了。阅读最近的Symfony文档欧宝娱乐app下载地址。
安全的选民提供一种机制来建立细粒度在Symfony应用程序的限制。欧宝娱乐app下载地址的主要优势acl是一个数量级容易设置,配置和使用。
在以前的Symfony的欧宝娱乐app下载地址版本中,选民的实现VoterInterface
接口,它具有以下签名:
1 2 3 4 5 6
接口VoterInterface{公共函数supportsAttribute(美元属性);公共函数supportsClass(美元类);公共函数投票(TokenInterface美元令牌,美元对象数组,美元属性);}
实现了这个接口很简单,但是生成的代码通常是有点臃肿,证明了以下83行代码需要定义一个简单的投票:
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\安全\授权\选民;使用欧宝娱乐app下载地址\组件\安全\核心\授权\选民\VoterInterface;使用欧宝娱乐app下载地址\组件\安全\核心\身份验证\令牌\TokenInterface;使用欧宝娱乐app下载地址\组件\安全\核心\用户\用户界面;类PostVoter实现了VoterInterface{常量视图=“视图”;常量编辑=“编辑”;公共函数supportsAttribute(美元属性){返回in_array (美元属性,数组(自我::看来,自我::编辑);}公共函数supportsClass(美元类){美元supportedClass=“Acme \ DemoBundle \实体\职位”;返回美元supportedClass= = =美元类| | is_subclass_of (美元类,美元supportedClass);}/ * * *@var\ \ Acme \ DemoBundle \实体后美元* /公共函数投票(TokenInterface美元令牌,美元帖子数组,美元属性){/ /检查是否支持这类物体的选民如果(!美元这- >supportsClass (get_class (美元帖子))){返回VoterInterface::ACCESS_ABSTAIN;}/ /检查是否使用正确,选民只允许一个属性/ /这不是必需的,它只是一个简单的方法/ /设计你的选民如果(1! = = count (美元属性)){扔新\ InvalidArgumentException (只能填报一个属性的查看或编辑的);}/ /设置属性来检查美元属性=美元属性(0];/ /检查给定的属性是由选民如果(!美元这- >supportsAttribute (美元属性)){返回VoterInterface::ACCESS_ABSTAIN;}/ /获得当前登录用户美元用户=美元令牌- >getUser ();/ /确保有一个用户对象(即用户登录)如果(!美元用户运算符用户界面){返回VoterInterface::ACCESS_DENIED;}开关(美元属性){情况下自我::观点:/ /数据对象可以例如isPrivate方法()/ /检查布尔属性私人美元如果(!美元帖子- >isPrivate ()) {返回VoterInterface::ACCESS_GRANTED;}打破;情况下自我::编辑:/ /我们认为数据对象有一个getOwner()方法/ /获取当前所有者用户数据对象实体如果(美元用户- >getId () = = =美元帖子- >getOwner ()- >getId ()) {返回VoterInterface::ACCESS_GRANTED;}打破;}返回VoterInterface::ACCESS_DENIED;}}
作为的结果欧宝娱乐app下载地址Symfony DX倡议,欧宝娱乐app下载地址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行代码:
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
/ / src / Acme / DemoBundle /安全/授权/选民/ PostVoter.php名称空间Acme\DemoBundle\安全\授权\选民;使用欧宝娱乐app下载地址\组件\安全\核心\授权\选民\AbstractVoter;使用欧宝娱乐app下载地址\组件\安全\核心\用户\用户界面;类PostVoter扩展AbstractVoter{常量视图=“视图”;常量编辑=“编辑”;受保护的函数getSupportedAttributes(){返回数组(自我::看来,自我::编辑);}受保护的函数getSupportedClasses(){返回数组(“Acme \ DemoBundle \实体\职位”);}受保护的函数isGranted(美元属性,美元帖子,美元用户= null){/ /确保有一个用户对象(即用户登录)如果(!美元用户运算符用户界面){返回假;}/ /自定义业务逻辑来判断给定的用户可以查看/ /和/或编辑文章如果(美元属性= =自我::视图& & !美元帖子- >isPrivate ()) {返回真正的;}如果(美元属性= =自我::编辑& &美元用户- >getId () = = =美元帖子- >getOwner ()- >getId ()) {返回真正的;}返回假;}}
编写更少的代码之前得到相同的结果能提高您的生产力。引入以来,这是我们对DX倡议和Symfony 2.6将第一个版本接受这种新哲学。欧宝娱乐app下载地址
发表在#生活在边缘
评论
评论都关门了。
以确保评论保持相关,他们关闭了旧的帖子。
+ 1000点DX倡议。
Git一个问题:如何将商务逻辑到第三项是否允许我列表所示。管理的项目列表吗?我不会做一个isGranted在foreach()循环。但有一种机制计划吗?
我在当前项目实施机制不久的选民。SonataAdmin的帮助我得到访问查询创建列表。所以建立一个工厂循环标记“queryHelpers”也有一个接口作为选民。而是他们只是投票减少/操作查询。
我知道这需要一些抽象方法,但是我想打开一个RFC如果有人想知道更多的细节。
这些方法不是称为由经理在投票之前,你必须重复(或者至少写额外的)投票方法中的代码本身。
如果你不支持属性或对象,你只是返回VoterInterface: ACCESS_ABSTAIN投票的方法。此外,有时类决定是不够的——你需要对象本身。
最后,我认为这个抽象选民可能有这些方法的默认实现,而实际上不会在Symfony的标准。欧宝娱乐app下载地址