如何使用访问控制列表(acl)
编辑该页面警告:你浏览的文档欧宝官网下载appob娱乐下载Symfony 2.4,不再维护。
读这个页面的更新版本Symfob娱乐下载ony 6.3(当前的稳定版本)。
如何使用访问控制列表(acl)
在复杂的应用程序,您将经常面临的问题决定不能仅仅是基于人的访问(令牌
)请求访问,但还涉及一个域对象,访问被要求。这是ACL系统的由来。
acl的替代品
使用ACL的不平凡,简单的用例,它可能是多余。如果你允许逻辑可以被写一些代码(例如,检查一个博客是否属于当前用户),那么考虑使用选民。选民要投票表决通过了对象,您可以使用复杂的决策和有效地实施自己的ACL。(如执行授权isGranted
部分)将在该条目类似于你所看到的,但是你的选民类将在幕后处理逻辑,而不是ACL系统。
想象一下你正在设计一个博客系统,用户可以评论你的文章。现在,你想要一个用户能够编辑自己的评论,而不是其他用户;此外,你希望能够编辑所有评论。在这个场景中,评论
将你想限制访问的域对象。你可以用几种方法来完成这个使用Symfony的两种基本方法(简单):ob娱乐下载
- 执行安全在你的业务方法:基本上,这意味着保持在每个的引用
评论
所有用户访问,然后比较这些用户提供的令牌
。 - 执行安全与角色:在这种方法中,您将添加一个角色
评论
对象,即。ROLE_COMMENT_1
,ROLE_COMMENT_2
等。
这两种方法是完全有效的。然而,他们夫妇授权逻辑业务代码使其在其他地方,可重用性降低,也会增加单元测试的难度。此外,你可能会遇到性能问题如果很多用户会访问一个域对象。
幸运的是,有一个更好的办法,你会发现。
引导
现在,你终于可以采取行动之前,你需要做一些引导。首先,您需要配置连接ACL系统应该使用:
1 2 3 4
# app / config / security.yml安全:acl:连接:默认的
1 2 3 4
< !——app / config /安全。xml - - ><acl><连接>默认的< /连接>< /acl>
1 2 3 4
/ / app / config / security.php美元容器- >loadFromExtension (“安全”,“acl”,数组(“连接”= >“默认”));
请注意
ACL系统需要连接从教义DBAL(可用默认情况下)或教义MongoDB(可用MongoDBAclBundle)。然而,这并不意味着你必须使用ORM教义或ODM映射您的域对象。您可以使用您喜欢的任何映射器为你的对象,无论是教义ORM, MongoDB ODM,推动,原始SQL等。这是你的选择。
连接配置之后,您必须导入数据库结构。幸运的是,有一个任务。简单地运行以下命令:
1
$ php应用程序/控制台初始化:acl
开始
回到小例子从一开始,你现在可以实现ACL。
ACL被创建后,您可以通过创建一个访问控制授权访问对象实体(ACE)巩固实体之间的关系和你的用户。
创建ACL和添加一个王牌
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
/ / src / Acme / DemoBundle /控制器/ BlogController.php名称空间Acme\DemoBundle\控制器;使用ob娱乐下载\包\FrameworkBundle\控制器\控制器;使用ob娱乐下载\组件\安全\核心\异常\AccessDeniedException;使用ob娱乐下载\组件\安全\Acl\域\ObjectIdentity;使用ob娱乐下载\组件\安全\Acl\域\UserSecurityIdentity;使用ob娱乐下载\组件\安全\Acl\许可\MaskBuilder;类BlogController扩展控制器{/ /……公共函数addCommentAction(文章美元帖子){美元评论=新评论();/ /……设置美元形式,并提交数据如果(美元形式- >isValid ()) {美元entityManager=美元这- >getDoctrine ()- >getManager ();美元entityManager- >persist (美元评论);美元entityManager- >冲洗();/ /创建ACL美元aclProvider=美元这- >get (“security.acl.provider”);美元objectIdentity= ObjectIdentity::fromDomainObject (美元评论);美元acl=美元aclProvider- >createAcl (美元objectIdentity);/ /获取当前登录用户的安全标识美元securityContext=美元这- >get (“security.context”);美元用户=美元securityContext- >getToken ()- >getUser ();美元securityIdentity= UserSecurityIdentity::fromAccount (美元用户);/ /允许所有者访问美元acl- >insertObjectAce (美元securityIdentity,MaskBuilder::MASK_OWNER);美元aclProvider- >updateAcl (美元acl);}}}
有几个重要的实现决定的代码片段。现在,我只想强调二:
首先,您可能已经注意到,- > createAcl ()
不接受直接的域对象,但只有实现的呢ObjectIdentityInterface
。这个额外的间接步骤允许您使用acl,即使你没有实际的域对象实例。这将是非常有用的,如果你想检查权限为大量对象实际上没有补水这些对象。
另一个有趣的部分是- > insertObjectAce ()
调用。在这个例子中,你给予当前登录的用户所有者访问发表评论。的MaskBuilder: MASK_OWNER
是一个预定义的整数位掩码;别担心面具builder将抽象大部分的技术细节,但是使用这种技术你可以在一个数据库行存储许多不同的权限赋予一个相当大的性能提升。
提示
ace的顺序检查是重要的。作为一般规则,你应该更具体的条目在一开始。
检查访问
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
/ / src / Acme / DemoBundle /控制器/ BlogController.php/ /……类BlogController{/ /……公共函数editCommentAction(评论美元评论){美元securityContext=美元这- >get (“security.context”);/ /检查编辑访问权如果(假= = =美元securityContext- >isGranted (“编辑”,美元评论)){扔新AccessDeniedException ();}/ /……检索实际评论对象和你的编辑}}
在本例中,您检查用户是否有编辑
许可。在内部,Symfony将ob娱乐下载权限映射到几个整数位掩码,并检查用户是否有任何。
请注意
您可以定义多达32基本权限(取决于您的操作系统PHP 30 - 32之间可能有所不同)。此外,您还可以定义累积权限。
累积的权限
在上面的第一个例子中,您只授予用户老板
基地的许可。而这实际上也允许用户执行任何操作如视图、编辑等域对象,在某些情况下,您可能想要显式授予这些权限。
的MaskBuilder
可用于创建一些面具很容易通过结合几个基本权限:
1 2 3 4 5 6 7 8
美元构建器=新MaskBuilder ();美元构建器- >add (“视图”)- >add (“编辑”)- >add (“删除”)- >add (“恢复”);美元面具=美元构建器- >get ();/ / int (29)
这个整数位掩码可以用来授予一个用户基本权限添加上图:
1 2
美元身份=新UserSecurityIdentity (“约翰”,“Acme \ UserBundle \实体\用户”);美元acl- >insertObjectAce (美元身份,美元面具);
用户现在可以查看、编辑、删除和un-delete对象。