我正在开发一个CRM,它将具有高级授权和在系统中具有特定角色的组中的用户管理。
基本上,我想做的是:
我在security.yml文件中了解ROLE_xxxx,但我不想对角色进行硬编码。
例如,我希望有一种矩阵/网格,超级管理员可以在其中创建自定义授权角色。
其中一个角色可能是:“团队负责人”可以查看和编辑员工的电子邮件地址,但无法查看或编辑Employee_Wage字段。
另一个用例是用户组“Accounting”中的用户可以调用actionInvoiceAction()但他无法访问动作createNewEmployeeAction()。
另一个用例是PROJECT LEADER可以使用newProjectAction()添加项目,但PROJECT对象的某些字段/属性不可见/可由组PROJECT LEADER访问
我知道您可以在安全性和路由中设置这些,但我宁愿不对这些角色进行硬编码。例如,如果公司决定他们想要创建一个具有特定角色的新组,他们应该能够。
我的(伪)决议
遍历每个域模型,操作/功能和对象/字段并为CRUD创建角色,例如创建EMPLOYEE_FIRSTNAME_READ,EMPLOYEE_FIRSTNAME_UPDATE,EMPLOYEE_CREATE,EMPLOYEE_EDIT,EMPLOYEE_DELETE等...
使用标题字段创建数据库对象“组”,标题字段包含所有角色的组合数组。
将用户置于群组
这是可行的方法还是有更好的方法在Symfony2中实现这一目标?
基本上:创建一个具有基于域模型,对象,字段等特定角色的组...可以使用管理员后端进行配置。
我希望我能正确解释,请随时回复并询问更多信息。
(我记得Invision Power Board的旧版本,你可以配置一个权限掩码网格并将其附加到一个组)
答案 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行
然后,您可以将后端中的组和实体作为普通实体进行管理,并将用户添加到组中
使用ACL但将用户标识更改为角色标识。 http://symfony.com/doc/current/cookbook/security/acl_advanced.html