【问题标题】:FOS Bundle User - multiple rolesFOS 捆绑用户 - 多个角色
【发布时间】:2018-04-03 16:44:03
【问题描述】:

我正在探索 FOS Bundle User 的可能性。

感谢 Knpuniversity (https://knpuniversity.com/screencast/fosuserbundle/roles-canonical-fields) 我发现了这个用于管理用户的好包。

在我的情况下,我还需要多个角色 BUUUUUUT 我不想将它与用户表中的字段中的角色数组一起保存。我的意图是使用更多具有“n”到“m”关系的表,其中 1 个用户具有“n”个角色,“n”个用户也可以使用 1 个角色。

因此,我需要一张表来管理用户和角色,而不是一张表来管理用户和角色,一张表用于角色,最后一张表来建立它们之间的 n-m 关系。我需要它,因为我会将这种结构用于其他功能并将角色保存为数组...会产生比解决更多的问题...在我的情况下。

您打算如何实现这一目标? 也许另一个捆绑? 也许是一个简单的解决方案来调整捆绑包以适应我的要求?

你觉得我能做什么?

【问题讨论】:

    标签: symfony fosuserbundle user-roles symfony-3.3 symfony3.x


    【解决方案1】:

    使用 FOSUserBundle,您确实可以通过该包创建的组类管理所有类型的角色。

    在 symfony 的正常流程中,这些组默认情况下不存在。它是提供此捆绑包的一项额外功能,但它可以帮助您更好地管理用户的角色。

    【讨论】:

      【解决方案2】:

      这就是我正在做的事情,对我来说效果很好:

      我有一个用户、角色和一个组实体

      用户实体

      use FOS\UserBundle\Model\User as BaseUser;
      use Doctrine\ORM\Mapping as ORM;
      
              /**
               * @ORM\Entity
               * @ORM\Table(name="fos_user")
               */
              class User extends BaseUser
              {
                  /**
                   * @ORM\Id
                   * @ORM\Column(type="integer")
                   * @ORM\GeneratedValue(strategy="AUTO")
                   */
                  protected $id;
      
                  public function __construct()
                  {
                      parent::__construct();
                      // your own logic
                  }
              }
      

      集团实体

      use FOS\UserBundle\Model\Group as BaseGroup;
      use Doctrine\ORM\Mapping as ORM;
      
              /**
               * @ORM\Entity
               * @ORM\Table(name="fos_group")
               */
              class Group extends BaseGroup
              {
                  /**
                   * @ORM\Id
                   * @ORM\Column(type="integer")
                   * @ORM\GeneratedValue(strategy="AUTO")
                   */
                   protected $id;
              }
      

      这一切都来自FOS docs

      现在角色默认以数组的形式出现,但 symfony 提供了一个 Symfony\Component\Security\Core\Role\Role 类来扩展它。

      所以你的角色类应该是这样的:

      角色实体

      use Symfony\Component\Security\Core\Role\Role as BaseRol;
      use Doctrine\ORM\Mapping as ORM;
      
              /**
               * @ORM\Entity
               * @ORM\Table(name="fos_role")
               */
              class Role extends BaseRol
              {
                  /**
                   * @ORM\Id
                   * @ORM\Column(type="integer")
                   * @ORM\GeneratedValue(strategy="AUTO")
                   */
                  protected $id;
      
                  public function __construct()
                  {
                      parent::__construct();
                      // your own logic
                  }
              }
      

      要做到这一点,您只需添加如下映射信息。

      支持用户实体中的组

      /**
                   * @ORM\ManyToMany(targetEntity="path/to/my/groupEntity")
                   * @ORM\JoinTable(name="join_table_name",
                   *      joinColumns={@ORM\JoinColumn(name="join_column_name_id", referencedColumnName="id")},
                   *      inverseJoinColumns={@ORM\JoinColumn(name="join_column_name_id", referencedColumnName="id")}
                   * )
                   */
                  protected $groups;
      

      支持组和用户实体中的角色

       /**
                       * @ORM\ManyToMany(targetEntity="path/to/my/roleEntity")
                       * @ORM\JoinTable(name="join_table_name",
                       *      joinColumns={@ORM\JoinColumn(name="join_column_name_id", referencedColumnName="id")},
                       *      inverseJoinColumns={@ORM\JoinColumn(name="join_column_name_id", referencedColumnName="id")}
                       * )
                       */
                      protected $roles;
      

      然后更新您的数据库,您就可以开始了。

      【讨论】:

        【解决方案3】:

        最后我所做的是使用 FOSUserBunlde 中的功能,使用角色和组,其中每个角色都用作执行控制器的权限,而组则可以轻松管理来自用户的所有角色。

        【讨论】:

          【解决方案4】:

          我将创建一个新的 UserManager 类来扩展 FosUserManager 类,覆盖与角色相关的方法。但不确定是否值得。此外,您必须创建一个从 FosUserBundle 用户模型扩展的中间普通对象,然后使用它来创建您的用户实体。在这个中间对象中,您将不得不更改角色的存储方式。

          说真的,我不确定这是否比从头开始自己的用户管理更好。

          【讨论】:

          • 如果有必要我会照你说的在路上做。关键是要尽量避免使用此功能,并利用在 symfony 等未来更新中使用通用捆绑包的优势。如果其他人有更多想法,请...我想在最终决定之前听取更多选项自己做身份验证用户,管理角色功能。等
          猜你喜欢
          • 2013-04-08
          • 2014-01-06
          • 1970-01-01
          • 2012-02-19
          • 1970-01-01
          • 2019-01-31
          • 1970-01-01
          • 2012-11-08
          相关资源
          最近更新 更多