Symfony2 - 动态角色管理

时间:2012-12-12 19:59:10

标签: php security symfony authorization user-management

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

基本上,我想做的是:

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

我在security.yml文件中了解ROLE_xxxx,但我不想对角色进行硬编码。

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

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

另一个用例是用户组“Accounting”中的用户可以调用actionInvoiceAction()但他无法访问动作createNewEmployeeAction()。

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

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

我的(伪)决议

  1. 遍历每个域模型,操作/功能和对象/字段并为CRUD创建角色,例如创建EMPLOYEE_FIRSTNAME_READ,EMPLOYEE_FIRSTNAME_UPDATE,EMPLOYEE_CREATE,EMPLOYEE_EDIT,EMPLOYEE_DELETE等...

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

  3. 将用户置于群组

  4. 这是可行的方法还是有更好的方法在Symfony2中实现这一目标?

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

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

    (我记得Invision Power Board的旧版本,你可以配置一个权限掩码网格并将其附加到一个组)

2 个答案:

答案 0 :(得分: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注释来自{{1}}(我假设您使用它)来检查相关的域对象权限

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

希望这有点帮助...

答案 1 :(得分: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