symfony2 选民或 acl
Posted
技术标签:
【中文标题】symfony2 选民或 acl【英文标题】:symfony2 voters or acl 【发布时间】:2014-05-21 08:45:05 【问题描述】:我正在构建系统并试图在 Voters 和 ACL 之间做出决定。我需要实现的是应该有具有不同角色的用户来访问对象属性,例如:经过身份验证的常规用户可以看到 Post 及其内容,但看不到它的“Position”属性,并且具有编辑角色的用户也可以看到 Post 和它的内容,并有权查看“位置”属性并对其进行编辑。 我可以单独使用投票器来实现此功能,还是需要使用 ACL?
编辑:
对于令人困惑的问题,我很抱歉,我是 symfony 的新手,还不太了解这些概念。我不想实现的是对象字段级别的权限。
普通用户可以访问“TITLE”和“CONTENT”属性,并修改“CONTENT”属性”,版主可以查看和编辑以前的属性,管理员应该可以访问所有对象属性,并对其进行任何操作.
【问题讨论】:
【参考方案1】:文档只解释了如何检查对象而不是属性的访问。 我将解释我在选择选民或 ACL 时做出的决定。接下来我将解释如何使用(层次结构)选民来实现您的目标。
当用户只是根据角色有权或无权访问对象时,可以使用防火墙执行访问,这是最简单的解决方案。
但是,当访问取决于特定规则下的每个对象时,应使用 Voter。例如,用户只能在创建帖子时对其进行编辑。但版主应该始终能够编辑帖子。
最困难的访问控制是当一个用户可以被其他用户授予访问权限时。例如,管理员可以将用户分配给帖子并授予他们编辑权限。这是一个无法完全根据用户角色来决定访问权限的解决方案。需要为每个用户存储对象的访问/权限。这就是 ACL 的作用。它存储每个用户对数据库中对象的权限。
至于你的问题。
大多数情况下,这些用途都是在代码本身中处理的。我见过很多不同的实体形式。 UserPostFormType
、ModeratorPostFormType
和 AdminPostFormType
。如您所见,这不是很干燥。并检查代码中的用户类型
考虑定义角色并使用层次结构管理它们。
为每个操作的每个属性定义单独的角色。 从而定义以下角色。
ROLE_ID_VIEW
ROLE_ID_EDIT
ROLE_TITLE_VIEW
ROLE_TITLE_EDIT
...
然后您可以将这些角色分配给正确的用户角色。
security:
role_hierarchy:
ROLE_USER: [ROLE_TITLE_VIEW, ROLE_CONTENT_VIEW, ROLE_CONTENT_EDIT]
ROLE_MODERATOR: [ROLE_USER, ROLE_TITLE_EDIT]
ROLE_ADMIN: [ROLE_MODERATOR, ROLE_ID_EDIT, ROLE_ID_VIEW]
您现在可以使用 Hierarchy Voter 检查用户是否可以修改或查看某个属性。 最干净的解决方案是在您的表单上创建一个侦听器,它根据当前用户拥有的权限在您的表单上添加字段。
【讨论】:
谢谢,前段时间我以类似的方式解决了这个问题(通过创建用户角色,但没有单独的字段)。你的回答更有意义。【参考方案2】:选民与 ACL 无关。选民关注的是路由访问,而 ACL 关注的是对象读/写访问。所以这不是一个或另一个,因为它们彼此没有任何关系。
【讨论】:
来自Symfony docs “使用 ACL 并非易事,对于更简单的用例 (...),请考虑使用选民。” 当路由确实包含某种类型的对象 ID 时,我确实使用选民来检查用户是否可以访问对象。另外,您可以将对象传递给选民,所以我不明白您为什么不能这样做...以上是关于symfony2 选民或 acl的主要内容,如果未能解决你的问题,请参考以下文章
Symfony2 自定义选民:无法从选民内部访问 getDoctrine