在包配置

时间:2016-12-29 09:41:27

标签: symfony

我对我长期以来想要理解的角色有一些疑问:

1。我们在一些项目中使用了一些捆绑包。我们想在bundle配置中定义角色,这样我们就不会将角色复制到security.yml中的role_hierarchy中。有没有干净的方法呢?

我的第一个想法是将它们导入到role_hierarchy中,如下所示:

role_hierarchy:
    ROLE_ADMIN:                             ROLE_USER, ROLE_TRANSLATOR
    ROLE_SUPER_ADMIN:                       ROLE_ADMIN
    ROLE_NOT_APPROVED_USER:                 ROLE_USER
    ROLE_TRANSLATOR:                        ROLE_USER
    "%base_bundle.role.hierarchy%"

这当然不起作用。有没有可能这样做(在yaml中合并数组)?

我的另一个想法是将角色存储在数据库中,但在我看来这是过度的,因为我们没有动态角色。一切都是静止的。

是否有任何解决方法可以实现我的目标?或者在捆绑中定义它是个好主意吗?

2。我使用角色作为权限(ROLE_POST_EDITROLE_POST_DELETE,...)和选民拒绝或批准对资源的访问权限。所以最后有很多角色。将角色与权限混合是一个好主意吗?如果不是最佳做法是什么?

编辑:我觉得ROLE_POST_EDITROLE_USERROLE_ADMIN之间存在差异。用户有ROLE_USER因为他是用户。但是,用户有“权限ROLE_EDIT_POST”才能编辑帖子。在我看来,两者之间存在差异。无论如何我应该关心这种差异还是有其他做法怎么做?

1 个答案:

答案 0 :(得分:5)

  
      
  1. 我们在一些项目中使用了一些捆绑包。我们想在bundle配置中定义角色,这样我们就不会将角色复制到security.yml中的role_hierarchy中。有没有干净的方法呢?
  2.   

您可以Prepended Extensions使用" prepend"另一个扩展的配置:

class AcmeHelloExtension extends Extension implements PrependExtensionInterface
{
    // ...

    public function prepend(ContainerBuilder $container)
    {
        $container->prependExtensionConfig('security', [
            'role_hierarchy' => [
                'ROLE_ADMIN' => ...
                ...
            ],
        ]);
    }
}
  
      
  1. 我使用角色作为权限(ROLE_POST_EDIT,ROLE_POST_DELETE,...)和选民拒绝或批准对资源的访问。所以最后有很多角色。将角色与权限混合是一个好主意吗?如果不是最佳做法是什么?
  2.   

此处存在一些小错误:您使用role_hierarchy定义的角色 与您传递给isGranted()的内容相关。您已将属性传递给isGranted()。不幸的是,对于RoleHierarchyVoter,symfony决定将属性similair设置为角色名称(即,如果角色名称以ROLE_开头)。

选民在调用权限或属性时进行投票。因此,在isGranted()中拥有许多权限是完全有效和良好的做法。

但是,我建议不要使用ROLE_*启动它们。 RoleVoter / RoleHierarchyVoter检查这些属性。将它们命名为POST_EDITPOST_DELETE

if ($this->isGranted('POST_EDIT', $post)) {
    // ...
}