0

我正在尝试从数据库中提取角色以用于对用户进行身份验证。为此,我创建了一个扩展 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_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

4

1 回答 1

1

security.ymlrole_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]

因此,您的 name 字段在 security.yml 中没有任何意义,只有您的角色字段。角色层次结构与您存储角色的位置是分开的。这是一个额外的配置级别,例如,您不需要为每个超级管理员用户添加 3 个角色,而只需添加超级管理员角色,他们将继承所有其他角色。

希望这是有道理的,请记住,为了使用角色层次结构,您需要在数据库中拥有角色。如果您没有可以分配给用户的 ROLE_SUPER_ADMIN,那么配置上述 ROLE_SUPER_ADMIN 层次结构并不好。因此,在您的组表中创建所有角色,然后设置层次结构。

于 2013-06-24T09:34:21.840 回答