我的网站包含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的主要优势是什么?
答案 0 :(得分:1)
取决于申请类型。
我测试了ACL,但个人从未在我的应用中使用过,而不是我使用了选民。 ACL已准备好使用机制,如果您了解它的工作原理,它可以是强大的工具(非常先进)。
要检查一些基本权限,您将使用ROLES
- 例如->isGranted('ROLE_ADMIN')
正如你所说,如果你没有任何子资源就足够了。如果您创建简单的系统,这种方式很好。排名:GUEST
,EDITOR
,MODERATOR
,ADMIN
等。它易于阅读,理解和管理。
正如您所说,可以使用ROLES
来检查资源权限,但对于我(个人)使用ROLES
来保存此类信息,例如"他可以阅读和修改产品"是脏的。我认为存储"军队" ROLES
不是最好的主意。这是一个例子:
因为您不需要声明ROLES,所以可以创建类似的内容:
$resource_type = "PRODUCT";
$id = 3;
$role = "ROLE_".$resource_type."_".$id."_EDIT";
->isGranted($role);
在此示例中,您检查该用户是否具有角色ROLE_PRODUCT_3_EDIT
。
当用户创建新产品时,他会获得管理其资源的角色,您可以稍后再进行检查。例如,他可以获得这组角色:
ROLE_PRODUCT_3_EDIT
,ROLE_PRODUCT_3_READ
,ROLE_PRODUCT_3_DELETE
或ROLE_PRODUCT_3_OWNER
这只是一个例子,你可以用不同的方式做到这一点,但它显示了ROLES的问题。
如果您的用户创建了许多资源,他将获得许多很多角色......
此外,此方法存在一些缺陷 - 例如,您无法更改资源类型(PRODUCT
)或ID
- 如果您这样做,您的整个权限系统将会被破坏。
在使用它之前你必须了解它是如何工作的:)
我认为这个规则应该在任何地方使用,但ACL
这是非常重要的。
Symfony ACL
文档非常清楚。
在复杂的应用程序中,您经常会遇到访问问题 决策不仅可以基于请求的人(令牌) 访问,但也涉及正在访问的域对象 请求。这就是ACL系统的用武之地。
这就是全部。 ACL是内置的,随时可用的安全系统,它非常强大,但正如作者所说:
使用ACL并不是一件容易的事,对于更简单的用例,它可能是 矫枉过正。如果您的权限逻辑可以通过编写来描述 一些代码(例如,检查博客是否归当前用户所有),然后 考虑使用选民。选民被传递给被投票的对象, 您可以用它来制定复杂的决策并有效实施 你自己的ACL。执行授权(例如isGranted部分)将 看起来与你在这个条目中看到的相似,但是你的选民类会 处理幕后的逻辑,而不是ACL系统。
如果您了解如何使用ACL
非常容易使用,那么您甚至不需要创建任何特殊的数据库表或类。
如果您阅读ACL
代码,则可以看到ACL
基于Voters
。
You 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很适合实体资源。选民可以用于更复杂的情境,其中用户需要基于某些特殊情况的权限(也是正常情况)。