Php Symfony2-动态角色管理

Php Symfony2-动态角色管理,php,security,symfony,authorization,user-management,Php,Security,Symfony,Authorization,User Management,我正在开发一个CRM,它将提供高级授权,并管理在系统中具有特定角色的组中的用户 基本上,我想做的是: 管理(域)模型/控制器/操作的动态授权 管理对象和字段的动态授权 我知道security.yml文件中的角色_xxxx,但我不想硬编码这些角色 例如,我希望有一种矩阵/网格,超级管理员可以在其中创建自定义授权角色 其中一个角色可以是:“团队领导”可以查看和编辑员工的电子邮件地址,但不能查看或编辑员工工资字段 另一个用例是,用户组“Accounting”中的用户可以调用操作generateIn

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

基本上,我想做的是:

  • 管理(域)模型/控制器/操作的动态授权
  • 管理对象和字段的动态授权
我知道security.yml文件中的角色_xxxx,但我不想硬编码这些角色

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

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

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

另一个用例是,项目负责人可以使用newProjectAction()添加项目,但组项目负责人无法查看/访问项目对象的某些字段/属性

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

My(伪)-解决方案

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

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

  • 将用户放入组中

  • 在Symfony2中,这是一种解决方法还是有更好的方法

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

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


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

    根据您在这里所说的内容,我认为应该使用
    ACL

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

    $securityContext = $this->get('security.context');
    $comment = ... // load using Doctrine?
    
    if (false === $securityContext->isGranted('EDIT', $comment))
    {
        throw new AccessDeniedException();
    }
    
    如果您要扩展Symfony的
    控制器
    类,我强烈建议在这两个类之间再添加一个类,它将实现常见的安全逻辑,以尽可能减少可能多的错误

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


    希望这有点帮助…

    我正面临着同样的问题,在多次搜索和引用现有捆绑包(FOSUserBundle、SonataUserBundle)后,我会这样解决它:

    $securityContext = $this->get('security.context');
    $comment = ... // load using Doctrine?
    
    if (false === $securityContext->isGranted('EDIT', $comment))
    {
        throw new AccessDeniedException();
    }
    
    创建自己的用户实体扩展UserInterface,然后自定义函数getRoles(); 1.在这个函数中你可以查询用户属于哪个组,从该组中得到所有角色。有关更多详细信息,请参考FOSUserBundle的用户模型和用户实体文件。 第247行

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

  • 使用ACL,但将用户标识更改为角色标识。


  • 从symfony 2.4开始,不再需要jms捆绑包@安全将得到支持:)是的,上帝保佑他们!:)编辑:(由于soem原因,我无法按)@Security以避免冲突。