FOS Bundle用户 - 多个角色

时间:2017-10-23 07:42:35

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

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

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

在我的情况下,我还需要多个角色BUUUUUUT我不想在用户表的字段中用一系列角色保存它。我的目的是使用更多的关系表' n'到了' m'其中1位用户有' n'角色和1个角色可以被' n'用户也。

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

您打算如何实现这一目标? 也许另一捆? 也许是一个简单的解决方案来使捆绑符合我的要求?

你认为我能做什么?

4 个答案:

答案 0 :(得分:1)

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

我有用户,角色和群组实体

  

用户实体

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;

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

答案 1 :(得分:1)

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

答案 2 :(得分:1)

实际上,有了FOSUserBundle,您可以通过此捆绑软件创建的groups类管理各种角色。

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

答案 3 :(得分:0)

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

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