1

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

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

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

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

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

你觉得我能做什么?

4

4 回答 4

2

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

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

于 2018-11-07T12:37:36.830 回答
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 文档

现在角色默认以数组的形式出现,但 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;

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

于 2017-10-24T12:28:36.707 回答
1

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

于 2017-11-28T16:15:48.153 回答
0

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

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

于 2017-10-23T08:05:40.417 回答