我正在尝试从数据库中提取角色以用于验证用户身份。为此,我创建了一个扩展Role的组对象,就像下面的代码一样:
// src/Acme/Bundle/UserBundle/Entity/Group.php
namespace Acme\UserBundle\Entity;
use Symfony\Component\Security\Core\Role\Role;
use Doctrine\Common\Collections\ArrayCollection;
use Doctrine\ORM\Mapping as ORM;
/**
* @ORM\Table(name="acme_groups")
* @ORM\Entity()
*/
class Group extends Role
{
/**
* @ORM\Column(name="id", type="integer")
* @ORM\Id()
* @ORM\GeneratedValue(strategy="AUTO")
*/
private $id;
/**
* @ORM\Column(name="name", type="string", length=30)
*/
private $name;
/**
* @ORM\Column(name="role", type="string", length=20, unique=true)
*/
private $role;
/**
* @ORM\ManyToMany(targetEntity="User", mappedBy="groups")
*/
private $users;
public function __construct()
{
$this->users = new ArrayCollection();
}
// ... getters and setters for each property
/**
* @see RoleInterface
*/
public function getRole()
{
return $this->role;
}
}
令我困惑的是,我无法看到此类与security.yml中相应字段之间的关系,例如:
role_hierarchy:
ROLE_ADMIN: ROLE_USER
ROLE_SUPER_ADMIN: [ROLE_USER, ROLE_ADMIN, ROLE_ALLOWED_TO_SWITCH]
那么名字会出现在右边吗?而右边的角色是什么?例如在
中 ROLE_ADMIN: ROLE_USER
ROLE_ADMIN会成为组名吗?ROLE_USER会成为角色吗?对我来说没有意义的是symfony2如何将role属性实现为单个变量而不是数组。自从声明
ROLE_SUPER_ADMIN: [ROLE_USER, ROLE_ADMIN, ROLE_ALLOWED_TO_SWITCH]
有多个角色,而不仅仅是一个角色。这些中的任何一个如何与上面定义的类相对应?我正在关注symfony2食谱http://symfony.com/doc/current/cookbook/security/entity_provider.html#managing-roles-in-the-database。
答案 0 :(得分:1)
security.yml role_hierarchy
与角色的继承有关。它允许您创建许多角色,然后声明某些角色继承其他角色。 http://symfony.com/doc/current/book/security.html#hierarchical-roles
ROLE_SUPER_ADMIN: [ROLE_USER, ROLE_ADMIN, ROLE_ALLOWED_TO_SWITCH]
以上意味着如果作为用户,我有角色“ROLE_SUPER_ADMIN”(来自组实体中的角色字段),那么我还继承角色“ROLE_USER,ROLE_ADMIN,ROLE_ALLOWED_TO_SWITCH”。
所以:ROLE_TO_INHERIT: [ROLES_TO_INHERIT_FROM]
所以你的名字字段在security.yml中没有任何意义,只有你的角色字段。角色层次结构与存储角色的位置是分开的。这是一个额外的配置级别,因此,例如,您不需要为每个超级管理员用户添加3个角色,而只需添加超级管理员角色,他们将继承所有其他角色。
希望这是有道理的,请记住,为了使用角色层次结构,您需要在数据库中拥有角色。如果您没有可以分配给用户的ROLE_SUPER_ADMIN,则配置上述ROLE_SUPER_ADMIN层次结构并不合适。因此,在组表中创建所有角色,然后设置层次结构。