【问题标题】:Where to define security roles?在哪里定义安全角色?
【发布时间】:2012-04-05 07:43:24
【问题描述】:

我有一个用户和一个组实体,它们都拥有一系列角色。

现在我想保持选项打开以修改角色、添加角色等等。

我应该为此在类中使用常量,还是应该将 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);
}

【问题讨论】:

  • 为什么不为此使用 FOSUserBundle?它提供您需要的一切。
  • 您好从 FOSUserBundle 切换回自己的 Bundle :) 我如何在 Symfony 中创建新角色?

标签: database security oop symfony roles


【解决方案1】:

如何为每个用户创建一个具有 ManyToOne 关系的 Roles 表。 Roles 表的一行将包含一个角色(字符串或常量 int)和一个用户。

或者,您可以创建一个 Roles 表并与 User 表建立 ManyToMany 关系。使用它,您可以动态定义角色,因此您不必对可能的角色进行硬编码。

在 OneToMany 的情况下,您可以通过编写这样的函数来检索角色:

/** @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;
}

别忘了你的 User 模型必须实现 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;
    }
}

【讨论】:

  • 您好,感谢您的详细描述。我会采取多对多的方式。你能推荐我在角色实体中使用什么属性吗?需要哪些属性才能与 ACL 兼容?另外我如何保证用户和组的多对多?
  • 一个组包含很多用户,每个用户有很多角色,每个角色有很多用户,恕我直言,组与用户角色无关。
  • 但是该组可以保存特殊数据。例如,有一个额外的 Admin-Group,所有成员都有额外的 ROLE_ADMIN。这难道不是一个很好的例子吗?
  • 然后在组和角色之间建立 OneToMany 关系,并在用户的 getRoles 方法中将返回数组与用户组的角色合并。我稍后会更新我的答案。
猜你喜欢
  • 1970-01-01
  • 2020-05-01
  • 2023-04-04
  • 1970-01-01
  • 2012-12-24
  • 1970-01-01
  • 1970-01-01
  • 2011-01-17
  • 2021-07-25
相关资源
最近更新 更多