Symfony2 - ACL 和角色

Symfony2 - ACL & ROLES

我的网站包含 3 种类型的用户,他们可能具有不同的角色。

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

根据角色,我知道他们可以进入哪些页面以及哪些页面不能使用 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 }

现在我不得不将每个用户可以执行的操作分开:编辑、删除等等。

我检查了 ACL 文档,结果一团糟。我看到我可以只使用 ROLES 做任何事情,只需调用 isGranted()。不管怎样,我想听听你们对 ACL 的看法?我的情况有必要吗?使用 ACL 的主要优势是什么?

这取决于应用程序的类型。

我测试了 ACL,但我个人从未在我的应用程序中使用过,我没有使用 Voters。 ACL 已准备好使用机制,如果您了解它的工作原理,它可以成为强大的工具(非常先进)。


角色

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

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

正如您所说,可以使用 ROLES 来检查资源权限,但对我(个人)来说,使用 ROLES 来保存此类信息,例如 "He can read and edit product" 是肮脏的。我认为存储 "army" of 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 文档很清楚。

In complex applications, you will often face the problem that access decisions cannot only be based on the person (Token) who is requesting access, but also involve a domain object that access is being requested for. This is where the ACL system comes in.

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

Using ACL's isn't trivial, and for simpler use cases, it may be overkill. If your permission logic could be described by just writing some code (e.g. to check if a Blog is owned by the current User), then consider using voters. A voter is passed the object being voted on, which you can use to make complex decisions and effectively implement your own ACL. Enforcing authorization (e.g. the isGranted part) will look similar to what you see in this entry, but your voter class will handle the logic behind the scenes, instead of the ACL system.

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

选民

如果您阅读 ACL 代码,您会发现 ACL 是建立在 Voters 之上的。 You can do very complicated permission system with Voters. Voter 是处理资源高级权限的好主意 - 例如,如果您的用户是 OWNER 或站点 ADMIN.

,则您的用户可以 EDIT 发表评论

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

  • (实体)User 有(实体)Rank
  • (entity)Rank 有一组 (string)ROLES
  • ROLE 给你一组 (string)PERMISSIONS.

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


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