FOS Bundle 用户 - 多重角色
FOS Bundle User - multiple roles
我正在探索 FOS Bundle User 的可能性。
感谢 Knpuniversity (https://knpuniversity.com/screencast/fosuserbundle/roles-canonical-fields) 我发现了这个管理用户的好包。
在我的例子中,我还需要多个角色 BUUUUUUT 我不想在用户 table 的字段中保存一组角色。我的意图是使用更多 table 与 'n' 到 'm' 的关系,其中 1 个用户具有 'n' 角色,'n' 用户也可以使用 1 个角色.
因此,我不需要一个 table 来管理用户和角色,我需要一个 table 用于用户,一个 table 用于角色,最后一个用于建立关系 n-m它们之间。我需要它,因为我将把这个结构用于其他功能并将角色保存为数组......会产生比解决问题更多的问题......在我的情况下。
你建议实现什么?
也许另一个包?
也许一个简单的解决方案可以使捆绑包适应我的要求?
你觉得我能做什么?
我会创建一个新的 UserManager class 扩展 FosUserManager class 覆盖角色相关的方法。但不确定是否值得。此外,您还必须创建一个从 FosUserBundle 用户模型扩展的中间普通对象,然后使用它来创建您的用户实体。在这个中间对象中,您必须更改角色的存储方式。
说真的,我不确定这是否比从头开始自己的用户管理更好。
这就是我正在做的并且对我来说效果很好:
我有一个用户、角色和一个组实体
User Entity
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
}
}
Group Entity
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 class 来扩展它。
所以你的角色 class 应该是这样的:
Role Entity
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
}
}
要发挥魔力,您只需添加如下映射信息。
To support groups in users entities
/**
* @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;
To support roles in both Group and User entity
/**
* @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;
之后更新您的数据库,您就可以开始了。
最后,我所做的是使用 FOSUserBunlde 中的功能,使用角色和组,其中每个角色都用作执行控制器和组的权限,以便轻松管理用户的所有角色。
有了 FOSUserBundle,您确实可以通过这个包创建的组 class 来管理所有类型的角色。
在 symfony 的正常流程中,默认情况下它们不存在。它是提供此捆绑包的一项额外功能,但它可以帮助您更好地管理用户的角色。
我正在探索 FOS Bundle User 的可能性。
感谢 Knpuniversity (https://knpuniversity.com/screencast/fosuserbundle/roles-canonical-fields) 我发现了这个管理用户的好包。
在我的例子中,我还需要多个角色 BUUUUUUT 我不想在用户 table 的字段中保存一组角色。我的意图是使用更多 table 与 'n' 到 'm' 的关系,其中 1 个用户具有 'n' 角色,'n' 用户也可以使用 1 个角色.
因此,我不需要一个 table 来管理用户和角色,我需要一个 table 用于用户,一个 table 用于角色,最后一个用于建立关系 n-m它们之间。我需要它,因为我将把这个结构用于其他功能并将角色保存为数组......会产生比解决问题更多的问题......在我的情况下。
你建议实现什么? 也许另一个包? 也许一个简单的解决方案可以使捆绑包适应我的要求?
你觉得我能做什么?
我会创建一个新的 UserManager class 扩展 FosUserManager class 覆盖角色相关的方法。但不确定是否值得。此外,您还必须创建一个从 FosUserBundle 用户模型扩展的中间普通对象,然后使用它来创建您的用户实体。在这个中间对象中,您必须更改角色的存储方式。
说真的,我不确定这是否比从头开始自己的用户管理更好。
这就是我正在做的并且对我来说效果很好:
我有一个用户、角色和一个组实体
User Entity
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
}
}
Group Entity
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 class 来扩展它。
所以你的角色 class 应该是这样的:
Role Entity
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
}
}
要发挥魔力,您只需添加如下映射信息。
To support groups in users entities
/**
* @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;
To support roles in both Group and User entity
/**
* @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;
之后更新您的数据库,您就可以开始了。
最后,我所做的是使用 FOSUserBunlde 中的功能,使用角色和组,其中每个角色都用作执行控制器和组的权限,以便轻松管理用户的所有角色。
有了 FOSUserBundle,您确实可以通过这个包创建的组 class 来管理所有类型的角色。
在 symfony 的正常流程中,默认情况下它们不存在。它是提供此捆绑包的一项额外功能,但它可以帮助您更好地管理用户的角色。