我正在开发一个CRM,它将具有高级授权和对在系统中具有特定角色的组中的用户进行管理.
基本上,我想做的是:
>管理(域)模型/控制器/操作的动态授权
>管理对象和字段的动态授权.
我知道security.yml文件中的ROLE_xxxx,但我不希望对角色进行硬编码.
例如,我想拥有一种矩阵/网格,超级管理员可以在其中创建自定义授权角色.
这些角色之一可能是:“团队负责人”可以查看和编辑员工的电子邮件地址,但是看不到或编辑Employee_Wage字段.
另一个用例是用户组“ Accounting”中的用户可以调用操作generateInvoiceAction(),但不能访问操作createNewEmployeeAction().
另一个用例是PROJECT LEADER可以使用newProjectAction()添加项目,但PROJECT LEADER组不可见/无法访问PROJECT对象的某些字段/属性
我知道您可以在安全性和路由中进行设置,但我不希望对这些角色进行硬编码.例如,如果公司决定要创建一个具有特定角色的新组,则他们应该能够.
我的(伪)解决方案
>遍历每个域模型,操作/功能和对象/字段,并为CRUD创建角色,例如创建EMPLOYEE_FIRSTNAME_READ,EMPLOYEE_FIRSTNAME_UPDATE,EMPLOYEE_CREATE,EMPLOYEE_EDIT,EMPLOYEE_DELETE等.
>创建一个带有标题字段的数据库对象“组”,该标题字段包含所有角色的组合数组.
>将用户分组
这是走的路还是在Symfony2中有更好的方法来实现呢?
基本上:根据域模型,对象,字段等创建具有特定角色的组,可以使用管理员后端进行配置.
希望我能正确解释,随时回复并索取更多信息.
(我记得较早版本的Invision电源板中的类似内容,您可以在其中配置权限掩码网格并将其附加到组中)
解决方法:
从您在这里所说的来看,我认为方法是使用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类,我强烈建议在其间添加一个以上的类,该类将实现通用的安全逻辑,以最大程度地减少错误.
另一方面,在使用服务时,您可以在其中提供对象作为参数,您可以依靠JMSSecurityExtraBundle(我假设您使用它)中的@SecureParam注释来检查相关的域对象权限.
http://jmsyst.com/bundles/JMSSecurityExtraBundle/master/annotations
希望这个对你有帮助…