Symfony - 了解超级管理员

时间:2013-10-30 09:00:11

标签: security symfony fosuserbundle

我正在尝试了解Symfony和“超级管理员”。

当我使用具有超级管理员权限的FOSUser to create a user

php app/console fos:user:create adminuser --super-admin

我首先想知道(来自文档)是什么意思

  

[...]指定--super-admin选项会将用户标记为超级管理员[...]

我想这意味着向用户授予ROLE_SUPER_ADMIN,因为我在用户表中没有看到任何超级管理员字段。

其次,虽然(仍然来自文档)

  

超级管理员可以访问您的应用程序的任何部分

security:
    role_hierarchy:
        ROLE_SUPER_ADMIN: [ROLE_ADMIN, ROLE_ALLOWED_TO_SWITCH, ...]

为什么我们仍然需要为它配置访问层次结构?

2 个答案:

答案 0 :(得分:4)

查看FOSUserBundle的代码,您会发现CreateUserCommand如果使用--super-admin标志调用,将使用布尔参数$superadmin=true调用UserManipulator

现在,UserManipulator调用将创建用户对象的UserManager,调用它的setSuperAdmin()方法并在之后保留新用户。

该方法如下:

public function setSuperAdmin($boolean)
{
    if (true === $boolean) {
        $this->addRole(static::ROLE_SUPER_ADMIN);
    } else {
        $this->removeRole(static::ROLE_SUPER_ADMIN);
    }

    return $this;
}

回答你的第一个问题:

--super-admin标记会导致FOSUserBundle创建一个ROLE_SUPER_ADMIN角色的新用户。

您仍然必须在安全配置中包含角色层次结构,因为ROLE_SUPER_ADMIN角色基本上与其他角色没有区别。

只有约定 provided by the Symfony standard edition,角色为ROLE_SUPER_ADMIN的用户不应具有任何访问限制。

如果您希望ROLE_SUPER_ADMIN默认绕过所有安全选民 - 请查看JMSSecurityExtraBundle的IddqdVoter,它为特殊角色ROLE_IDDQD实现此功能。但是,您已经在另一个问题here中提出了这一点。

答案 1 :(得分:1)

通过定义层次结构,您可以显式授予它ROLE_ADMIN和ROLE_ALLOWED_TO_SWITCH角色(或您可以拥有的其他自定义角色)

如果您对此行发表评论,并且尝试使用ROLE_SUPER_ADMIN用户访问具有ROLE_ADMIN检查的操作,则会出现不允许的错误。

ROLE_SUPER_ADMIN只是超级管理员角色应具有的名称的约定,但它没有自己的权限,您必须明确授予它们。