在bundle配置中定义角色

Tom*_*sgu 4 symfony

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

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

我的第一个想法是将它们导入到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%"
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

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

Wou*_*r J 6

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

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

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

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

小misconfusion在这里:你所定义的角色role_hierarchy相关的,你传递给的东西isGranted().你正在传递属性isGranted().不幸的是,对于RoleHierarchyVoter,symfony决定将属性similair设置为角色名称(即,如果角色名称以#开头ROLE_).

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

但是,我建议不要启动它们ROLE_*.RoleVoter/RoleHierarchyVoter检查这些属性.它们命名例如POST_EDIT,POST_DELETE:

if ($this->isGranted('POST_EDIT', $post)) {
    // ...
}
Run Code Online (Sandbox Code Playgroud)