在 FOSUserBundle 中清除组和角色的使用

Posted

技术标签:

【中文标题】在 FOSUserBundle 中清除组和角色的使用【英文标题】:Clean usage of groups and roles in FOSUserBundle 【发布时间】:2015-10-20 10:37:22 【问题描述】:

我目前正在做一个 Symfony2 项目。它基于 Sonata,使用 SonataUserBundle/FOSUserBundle 来管理用户。最初的开发做得很糟糕,我正在重构很多。

应用程序定义了三个级别的用户:

管理员 顾问 企业

这些被定义为具有 FOSUserBundle 的组,并附加了一堆角色。

现在在代码中的任何地方,以前的开发人员都使用(硬编码)组的数据库 ID 来制作这样的案例:

$userGroup = $em->getRepository('ApplicationSonataUserBundle:Group')->findOneByName($group_name);
$userGroupId = $userGroup->getId();

if ($userGroupId == 1) 
   // Administrator case
   ...
 else if ($userGroupId == 7) 
   // Consultant case
   ...

这显然很糟糕。

我的问题是我确定如何以一种好的方式重构它。 我看到了三种可能的方式:

    直接使用定义的角色:ROLE_ADMIN、ROLE_CONSULTANT、ROLE_BUSINESS;

    仍然使用组,但组名中有一些常量,以避免在整个地方重复它们;

    在 FOSUserBundle 之上使用多用户系统。我快速查看了RollerworksMultiUserBundle 和PUGXMultiUserBundle。虽然我不知道这是否有点开销,因为我的用户实际上共享相同的信息。

如果你们能指出我正确的方向,将不胜感激。也许有一个完整的其他方法可以正确地实现这一点。

【问题讨论】:

【参考方案1】:

我的建议是直接使用角色,并完全停止使用 FOSUserBundle 组。大多数时候,它们是无用的。 组是从 symfony1 sfGuardPlugin 继承的概念,当时 Symfony 2 中还没有角色层次结构(在稳定版本之前)。 在大多数情况下,角色层次结构足以满足需求,使组更加复杂而无益。对于其他少数情况,我发现使用与项目实际业务逻辑相关的投票者比使用 FOSUserBundle 组更易于维护(我想我已经 4 年没有在任何项目中使用过它们了)。

免责声明:我是 FOSUserBundle 的主要维护者。

【讨论】:

嗯,这就是我最终实际所做的。使用 FOSUserBundle 组似乎无关紧要,因为我们使用 Symfony 角色定义了相同的层次结构。我确实发现了选民,这对我在业务方面轻松设置一些支票有很大帮助。谢谢!

以上是关于在 FOSUserBundle 中清除组和角色的使用的主要内容,如果未能解决你的问题,请参考以下文章

将角色字段添加到 FOSUserBundle 组表单

在使用 FOSUserBundle 进行用户注册期间添加默认角色

FOSUserBundle 组角色设置

如何将数据库角色添加到 FOSUserBundle

使用 FosUserBundle symfony2 管理多个角色

Symfony2 FosUserBundle 角色 ROLE_ADMIN