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 的作用。它存储每个用户对数据库中对象的权限。


至于你的问题。 大多数情况下,这些用途都是在代码本身中处理的。我见过很多不同的实体形式。 UserPostFormTypeModeratorPostFormTypeAdminPostFormType。如您所见,这不是很干燥。并检查代码中的用户类型

考虑定义角色并使用层次结构管理它们。

为每个操作的每个属性定义单独的角色。 从而定义以下角色。

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

Symfony 2 ACL 与选民

将对象传递给自定义选民?

symfony2 不是有效的实体或映射的超类

Symfony2 - 扩展或替换 SonataUserBundle 注册表单

solidity经典案例-----智能投票