3

我正在开发一个 CRM,它将具有高级授权和管理在系统中具有特定角色的组中的用户。

基本上,我想做的是:

  • 管理(域)模型/控制器/操作的动态授权
  • 管理对象和字段的动态授权。

我知道 security.yml 文件中的 ROLE_xxxx ,但我不想对角色进行硬编码。

例如,我想要一种矩阵/网格,超级管理员可以在其中创建自定义授权角色。

其中一个角色可能是:“团队领导”可以查看和编辑员工的电子邮件地址,但不能查看或编辑 Employee_Wage 字段。

另一个用例是用户组“Accounting”中的用户可以调用操作 generateInvoiceAction(),但不能访问操作 createNewEmployeeAction()。

另一个用例是 PROJECT LEADER 可以使用 newProjectAction() 添加项目,但 PROJECT 对象的某些字段/属性对 PROJECT LEADER 组不可见/不可访问

我知道您可以在安全和路由中设置这些,但我不想对这些角色进行硬编码。例如,如果公司决定创建一个具有特定角色的新组,他们应该能够做到。

我的(伪)解决方案

  1. 查看每个域模型、操作/函数和对象/字段并为 CRUD 创建一个角色,例如创建 EMPLOYEE_FIRSTNAME_READ、EMPLOYEE_FIRSTNAME_UPDATE、EMPLOYEE_CREATE、EMPLOYEE_EDIT、EMPLOYEE_DELETE 等...

  2. 创建一个数据库对象“组”,其标题字段包含所有角色的组合数组。

  3. 将用户放入组

这是要走的路还是有更好的方法在 Symfony2 中实现这一目标?

基本上:创建一个基于域模型、对象、字段等具有特定角色的组......可以使用管理员后端进行配置。

我希望我能正确解释这一点,请随时回复并询问更多信息。

(我记得旧版本的 Invision Power Board 中的类似内容,您可以在其中配置权限掩码网格并将其附加到组)

4

2 回答 2

2

从你在这里所说的,我认为要走的路是使用ACL.

http://symfony.com/doc/master/cookbook/security/acl.html

但是,您必须自己检查权限,以使用以下方式启动每个安全方法:

$securityContext = $this->get('security.context');
$comment = ... // load using Doctrine?

if (false === $securityContext->isGranted('EDIT', $comment))
{
    throw new AccessDeniedException();
}

如果您正在扩展 Symfony 的Controller类,我强烈建议在其间再添加一个类,该类将实现常见的安全逻辑,以尽可能减少错误...

另一方面,在使用服务时,您可以提供一个对象作为参数,您可以依靠@SecureParam注释JMSSecurityExtraBundle(我假设您使用它)来检查相关的域对象权限。

http://jmsyst.com/bundles/JMSSecurityExtraBundle/master/annotations

希望这个对你有帮助...

于 2012-12-12T22:42:16.423 回答
2

我只是面临同样的问题,经过多次搜索和引用现有捆绑包(FOSUserBundle、SonataUserBundle)后,它可以这样解决:

创建您自己的用户实体扩展 UserInterface 然后自定义函数 getRoles(); http://symfony.com/doc/current/cookbook/security/custom_provider.html 1. 在这个函数里面可以查询用户属于哪个组,从组中得到所有的角色。您可以参考 FOSUserBundle 的用户模型和用户实体文件了解更多详细信息。https://github.com/FriendsOfSymfony/FOSUserBundle/blob/master/Model/User.php 第247行

  1. 然后您可以将后端中的组和实体作为普通实体进行管理,并将用户添加到组中

  2. 使用 ACL,但将用户身份更改为角色身份。 http://symfony.com/doc/current/cookbook/security/acl_advanced.html

于 2013-08-28T09:09:28.603 回答