symfony2选民或acl

时间:2014-05-21 08:45:05

标签: symfony acl

我正在构建系统并试图在选民和ACL之间做出决定。我需要实现的是应该有不同角色的用户访问对象属性,例如:经过身份验证的常规用户可以看到Post及其内容,但不能看到"位置"属性和具有编辑角色的用户也可以看到帖子及其内容,并且可以看到"位置"属性并编辑它。 我可以单独使用选民来实现此功能,还是需要使用ACL?

编辑:

对不起令人困惑的问题,我是symfony的新手,并且还不太了解这些概念。我想要实现的是对象字段级别的权限。 enter image description here

普通用户可以访问" TITLE"和"内容"属性,并修改"内容"属性",主持人可以查看和编辑以前的两个属性,管理员应该有权访问所有对象属性,并对它们做任何事情。

2 个答案:

答案 0 :(得分:11)

文档仅解释了如何检查对象而不是属性的访问权限。 我将解释在选民或ACL之间做出选择时做出的决定。接下来,我将解释如何使用(Hierachy)选民来实现目标。


  1. 当用户根据角色拥有或无法访问对象时,可以使用防火墙进行访问,这是最简单的解决方案。

  2. 但是,根据某些规则,当访问权限取决于每个对象时,应使用选民。例如,用户只能在创建帖子时对其进行编辑。但主持人应该总是很好地编辑帖子。

  3. 最困难的访问控制是用户可以被其他用户授予访问权限。例如,管理员可以将用户分配给帖子并授予他们编辑权限。这是一种解决方案,其中访问不能仅仅基于用户的角色来决定。需要为每个用户存储对象的访问/权限。这就是ACL的作用。它为每个用户存储数据库中对象的权限。


  4. 至于你的问题。 大多数情况下,这些用途都是在代码本身中处理的。我已经看到了很多不同形式的实体。 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检查用户是否可以修改或查看某个属性。 最干净的解决方案是在您的表单上创建一个Listener,它根据当前用户的权限在表单上添加字段。

答案 1 :(得分:-1)

选民与ACL无关。选民关注的是路由访问,而ACL关注的是对象读/写访问。所以它不是一个或另一个,因为它们彼此之间没有任何关系。