2016-12-29 71 views
3

定义角色我对角色的一些问题,我想明白了很久:在捆绑配置

我们有一些捆绑,我们在几个项目中使用。我们希望在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”才能编辑帖子。在我看来,有一个区别。无论如何,我应该关心这种差异还是有其他的做法如何做?

+0

你有没有试过这样: '''role_hierarchy: ROLE_SUPER_ADMIN:ROLE_ADMIN ROLE_NOT_APPROVED_USER:ROLE_USER ROLE_TRANSLATOR:ROLE_USER ROLE_ADMIN:[ROLE_USER,ROLE_TRANSLATOR]''' – rokas

+1

不知道这将帮助你,但结帐这:http://php-and-symfony.matthiasnoback.nl/2012/07/symfony2-security-creating-dynamic-roles-using-roleinterface/ –

+0

@rokas问题当然是,我我将数组参数'“%base_bundle.role.hierarchy%”'传递给角色层次结构。但问题不在于它。 @ B.Assem感谢您的链接。我已经看到了它,但可能没有想太多。事实上,这可以是一条路。所以我可以编写一个Role类并将bundle参数传递给它。 – user254319

回答

4
  1. 我们在几个项目中使用了一些捆绑包。我们希望在bundle config中定义角色,这样我们就不会将角色复制到security.yml中的role_hierarchy中。有没有干净的方法来做到这一点?

可以使用另一部分的Prepended Extensions到 “前面加上” 配置:

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

    public function prepend(ContainerBuilder $container) 
    { 
     $container->prependExtensionConfig('security', [ 
      'role_hierarchy' => [ 
       'ROLE_ADMIN' => ... 
       ... 
      ], 
     ]); 
    } 
} 
  • 我用角色的权限(ROLE_POST_EDIT,ROLE_POST_DELETE。 ..)和选民拒绝或批准访问资源。所以最后有很多角色。将角色与权限混合使用是一个好主意吗?如果不是最佳做法是什么?
  • 小misconfusion在这里:你role_hierarchy定义的角色与您传递给isGranted()的事情。您将属性传递给isGranted()。不幸的是,对于RoleHierarchyVoter,symfony决定将属性similair设置为角色名称(也就是说,如果角色名称以ROLE_开头)。

    选民在权限或属性被调用时进行投票。因此,在isGranted()中拥有许多权限是非常有效的。

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

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

    感谢您的回答。我不知道prependesExtensions。它适合我的使用情况。 我可能没有解释得很好。我有ROLE_POST_EDIT角色。只有拥有此角色的用户(甚至是其他角色)才能编辑帖子。然后我有属性(“编辑”,“显示”),我“传递给选民”isGranted('编辑',$后)。 但ROLE_POST_EDIT看起来更像是对我的许可(而不是选民的术语)。管理员有ROLE_ADMIN,因为他是管理员。用户拥有ROLE_USER,因为他是用户。但是用户可以有一个“权限ROLE_POST_EDIT”来编辑帖子。我应该关心它吗? – user254319

    +0

    @ user254319啊,没有。查看https://symfony.com/doc/current/security/voters.html。您将创建决定是否允许编辑帖子的选民。这个选民将检查例如它是该管理员或该帖子的原始拥有者。我总是建议每个用户有一个角色:用户在网站上的角色。 –

    +0

    对于一个用户来说,一个角色对我来说很合理,但在我的情况下它太静态了。如果用户有适当的许可,我们可以说约200个用户可以去的地方。并且应该可以每次更改用户或组权限。那么怎么做呢?在我们的例子中,很多选民看起来像是($ user-> hasRole('ROLE_LIST_POSTS'&& $ attribute ==='list')return ... GRANTED;只有少数我们检查用户是否以某种方式连接资源(例如所有者),所以acl似乎过于复杂了这个用例 – user254319