我正在尝试了解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, ...]
为什么我们仍然需要为它配置访问层次结构?
答案 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只是超级管理员角色应具有的名称的约定,但它没有自己的权限,您必须明确授予它们。