凡定义安全角色?(Where to define security roles?)

2019-09-16 08:54发布

我有一个用户和组实体,既保持角色数组。

现在我想保持选项开放modificate角色,将它们添加等。

我应该使用的类常量用于此或我应该与一个OneToOne,关系到保持所有角色的表?

最好的问候,pus.dev

用户<=>角色组<=>角色

public function getRoles()
{
    $roles = $this->roles;

    foreach ($this->getGroups() as $group) {
        $roles = array_merge($roles, $group->getRoles());
    }

    // we need to make sure to have at least one role
    $roles[] = static::ROLE_DEFAULT;

    return array_unique($roles);
}

Answer 1:

怎么样和多对一关系到每一个用户创建一个角色表。 角色表中的一行将包含一个角色(字符串或常量int)和一个用户。

另外,您可以创建一个角色表,并与用户表中的多对多关系。 使用这个你可以动态地定义角色,所以你不必硬编码可能发挥的作用。

在一对多的情况下,你可以通过写这样的功能恢复的作用:

/** @OneToMany(...) */
/** $roles contains strings */
protected $roles;

public function getRoles() {
    return $this->roles;
}

要么

/** @OneToMany(...) */
/** $roles contains integers */
protected $roles;

public function getRoles() {
    $rolesArr = array(1 => 'ROLE_ADMIN', 2 => 'ROLE_USER', 3 => 'ROLE_EDITOR'); // you should refactor $rolesArr
    $retRoles = array();
    foreach($this->roles as $role) {
        $retRoles[] = $rolesArr[$role];
    }
    return $retRoles;
}

在多对多的情况下,你可以通过写这样的功能恢复的作用:

/** @ManyToMany(...) */
protected $roles;
// ...
public function getRoles() {
    $retRoles = array();
    // symfony2 requires a string array
    foreach($this->roles as $role) {
        $retRoles[] = $role->getName(); // or $retRoles[] = 'ROLE_' . $role->getName();
    }
    return $retRoles;
}

不要忘记,你的用户模型必须实现symfony中内置的用户界面。

对于集团的角色,你可以这样做:

class Group
{
    /** @ManyToMany(...) */
    protected $roles;

    public function getRoles() {
        return $this->roles;
    }
}

class User
{
   /** @ORM\Column(...) */
   protected $group;

    /** @ManyToMany(...) */
    protected $roles;
    // ...

    public function getRoles() {
        $retRoles = array();
        // symfony2 requires a string array
        $roles = $this->roles->merge($this->group->getRoles());
        foreach($roles as $role) {
            $retRoles[] = $role->getName(); // or $retRoles[] = 'ROLE_' . $role->getName();
        }
        return $retRoles;
    }
}


文章来源: Where to define security roles?