2013-10-30 64 views
5

我想了解一些关于Symfony和“超级管理员”的内容。Symfony - 理解超级管理员

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

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

我首先想知道是什么意思(从DOC)

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

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

其次,虽然(仍从DOC)

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

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

为什么我们仍然需要配置的访问层级它呢?

回答

4

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

现在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中提出。

+0

好吧,我明白了,我认为这只是关于选民,我忘记了选民总是被称为。我也认为它是在Django中制作的,超级用户自动拥有所有权利。我无法想象我们想要隐藏某些超级用户的情况。 –

1

通过定义的层次结构,明确授予它的ROLE_ADMIN和ROLE_ALLOWED_TO_SWITCH角色(或其他自定义角色,你可以有)

如果你对此有何评论这一行,并尝试与您的ROLE_SUPER_ADMIN用户访问同一个动作一个ROLE_ADMIN检查,你会得到一个不允许的错误。

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

+0

你刚刚复制了我的答案的约定部分? :) – nifr

+0

哈哈,不,我们在同一时间:)我认为这是显而易见的答案,当你了解角色如何在Symfony2中工作。但我指出整个Symfony中的约定,不仅在FOSUserBundle – jmoreno

+0

谢谢你这个简单的答案。 –