Symfony2 - ACL& ROLES

时间:2016-06-10 11:27:19

标签: php symfony authorization acl roles

我的网站包含3种类型的用户,可能有不同的ROLES。

ROLE_TRAINEE

ROLE_COMPANY_SUPER_ADMIN, ROLE_COMPANY_ADMIN, ROLE_COMPANY_TUTOR, ROLE_COMPANY_GUEST

ROLE_UNIVERSITY_SUPER_ADMIN, ROLE_UNIVERSITY_ADMIN, ROLE_UNIVERSITY_COORDINATOR, ROLE_UNIVERSITY_GUEST

根据ROLE,我知道允许他们输入哪些页面以及未使用security.yml access_control块的内容。

access_control:
        - { path: ^/$, roles: IS_AUTHENTICATED_ANONYMOUSLY }
        - { path: ^/login, roles: IS_AUTHENTICATED_ANONYMOUSLY }
        - { path: ^/trainee, roles: ROLE_TRAINEE }
        - { path: ^/company, roles: ROLE_COMPANY_GUEST }
        - { path: ^/university, roles: ROLE_UNIVERSITY_GUEST }

现在我发现我必须将每个用户可以执行的操作分开:EDIT,DELETE等。

我检查了ACL文档,我完全搞砸了。我只是通过调用isGranted()看到我只能使用ROLES做所有事情。无论如何,我想听听你们对ACL的看法?在我的情况下是否有必要?使用ACL的主要优势是什么?

1 个答案:

答案 0 :(得分:1)

取决于申请类型。

我测试了ACL,但个人从未在我的应用中使用过,而不是我使用了选民。 ACL已准备好使用机制,如果您了解它的工作原理,它可以是强大的工具(非常先进)。

角色

要检查一些基本权限,您将使用ROLES - 例如->isGranted('ROLE_ADMIN')

正如你所说,如果你没有任何子资源就足够了。如果您创建简单的系统,这种方式很好。排名:GUESTEDITORMODERATORADMIN等。它易于阅读,理解和管理。

正如您所说,可以使用ROLES来检查资源权限,但对于我(个人)使用ROLES来保存此类信息,例如"他可以阅读修改产品"是脏的。我认为存储"军队" ROLES不是最好的主意。这是一个例子:

因为您不需要声明ROLES,所以可以创建类似的内容:

$resource_type = "PRODUCT";
$id = 3;
$role = "ROLE_".$resource_type."_".$id."_EDIT";
->isGranted($role);

在此示例中,您检查该用户是否具有角色ROLE_PRODUCT_3_EDIT。 当用户创建新产品时,他会获得管理其资源的角色,您可以稍后再进行检查。例如,他可以获得这组角色:

ROLE_PRODUCT_3_EDITROLE_PRODUCT_3_READROLE_PRODUCT_3_DELETEROLE_PRODUCT_3_OWNER

这只是一个例子,你可以用不同的方式做到这一点,但它显示了ROLES的问题。 如果您的用户创建了许多资源,他将获得许多很多角色...... 此外,此方法存在一些缺陷 - 例如,您无法更改资源类型(PRODUCT)或ID - 如果您这样做,您的整个权限系统将会被破坏。

ACL

在使用它之前你必须了解它是如何工作的:) 我认为这个规则应该在任何地方使用,但ACL这是非常重要的。

Symfony ACL文档非常清楚。

  

在复杂的应用程序中,您经常会遇到访问问题   决策不仅可以基于请求的人(令牌)   访问,但也涉及正在访问的域对象   请求。这就是ACL系统的用武之地。

这就是全部。 ACL是内置的,随时可用的安全系统,它非常强大,但正如作者所说:

  

使用ACL并不是一件容易的事,对于更简单的用例,它可能是   矫枉过正。如果您的权限逻辑可以通过编写来描述   一些代码(例如,检查博客是否归当前用户所有),然后   考虑使用选民。选民被传递给被投票的对象,   您可以用它来制定复杂的决策并有效实施   你自己的ACL。执行授权(例如isGranted部分)将   看起来与你在这个条目中看到的相似,但是你的选民类会   处理幕后的逻辑,而不是ACL系统。

如果您了解如何使用ACL非常容易使用,那么您甚至不需要创建任何特殊的数据库表或类。

VOTERS

如果您阅读ACL代码,则可以看到ACL基于VotersYou can do very complicated permission system with Voters. Voter最好处理资源的高级权限 - 例如,如果用户EDIT或网站OWNER,则用户可以ADMIN发表评论。

简而言之 - 您的权限取决于许多条件的所有情况。 使用Voters,您可以根据Ranks轻松创建权限系统。

  • (实体)User有(实体)Rank
  • (实体)Rank包含(字符串)ROLES
  • ROLE为您提供一组(字符串)PERMISSIONS

您可以管理用户Rank并更改排名权限以更改其ROLES。结果,具有此等级的所有用户都获得了新的权限。

简而言之 - 如果您有实体资源(文档系统),那么Voter或ACL是个好主意。记住你可以在同时使用ROLES和Voters 。 ACL很适合实体资源。选民可以用于更复杂的情境,其中用户需要基于某些特殊情况的权限(也是正常情况)。