我正在构建系统并试图在选民和ACL之间做出决定。我需要实现的是应该有不同角色的用户访问对象属性,例如:经过身份验证的常规用户可以看到Post及其内容,但不能看到"位置"属性和具有编辑角色的用户也可以看到帖子及其内容,并且可以看到"位置"属性并编辑它。 我可以单独使用选民来实现此功能,还是需要使用ACL?
对不起令人困惑的问题,我是symfony的新手,并且还不太了解这些概念。我想要实现的是对象字段级别的权限。
普通用户可以访问" TITLE"和"内容"属性,并修改"内容"属性",主持人可以查看和编辑以前的两个属性,管理员应该有权访问所有对象属性,并对它们做任何事情。
答案 0 :(得分:11)
文档仅解释了如何检查对象而不是属性的访问权限。 我将解释在选民或ACL之间做出选择时做出的决定。接下来,我将解释如何使用(Hierachy)选民来实现目标。
当用户根据角色拥有或无法访问对象时,可以使用防火墙进行访问,这是最简单的解决方案。
但是,根据某些规则,当访问权限取决于每个对象时,应使用选民。例如,用户只能在创建帖子时对其进行编辑。但主持人应该总是很好地编辑帖子。
最困难的访问控制是用户可以被其他用户授予访问权限。例如,管理员可以将用户分配给帖子并授予他们编辑权限。这是一种解决方案,其中访问不能仅仅基于用户的角色来决定。需要为每个用户存储对象的访问/权限。这就是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检查用户是否可以修改或查看某个属性。 最干净的解决方案是在您的表单上创建一个Listener,它根据当前用户的权限在表单上添加字段。
答案 1 :(得分:-1)
选民与ACL无关。选民关注的是路由访问,而ACL关注的是对象读/写访问。所以它不是一个或另一个,因为它们彼此之间没有任何关系。