我对我长期以来想要理解的角色有一些疑问:
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_EDIT
,ROLE_POST_DELETE
,...)和选民拒绝或批准对资源的访问权限。所以最后有很多角色。将角色与权限混合是一个好主意吗?如果不是最佳做法是什么?
编辑:我觉得ROLE_POST_EDIT
和ROLE_USER
或ROLE_ADMIN
之间存在差异。用户有ROLE_USER
因为他是用户。但是,用户有“权限ROLE_EDIT_POST
”才能编辑帖子。在我看来,两者之间存在差异。无论如何我应该关心这种差异还是有其他做法怎么做?
答案 0 :(得分:5)
- 我们在一些项目中使用了一些捆绑包。我们想在bundle配置中定义角色,这样我们就不会将角色复制到security.yml中的role_hierarchy中。有没有干净的方法呢?
醇>
您可以Prepended Extensions使用" prepend"另一个扩展的配置:
class AcmeHelloExtension extends Extension implements PrependExtensionInterface
{
// ...
public function prepend(ContainerBuilder $container)
{
$container->prependExtensionConfig('security', [
'role_hierarchy' => [
'ROLE_ADMIN' => ...
...
],
]);
}
}
- 我使用角色作为权限(ROLE_POST_EDIT,ROLE_POST_DELETE,...)和选民拒绝或批准对资源的访问。所以最后有很多角色。将角色与权限混合是一个好主意吗?如果不是最佳做法是什么?
醇>
此处存在一些小错误:您使用role_hierarchy
定义的角色 与您传递给isGranted()
的内容相关。您已将属性传递给isGranted()
。不幸的是,对于RoleHierarchyVoter,symfony决定将属性similair设置为角色名称(即,如果角色名称以ROLE_
开头)。
选民在调用权限或属性时进行投票。因此,在isGranted()
中拥有许多权限是完全有效和良好的做法。
但是,我建议不要使用ROLE_*
启动它们。 RoleVoter / RoleHierarchyVoter检查这些属性。将它们命名为POST_EDIT
,POST_DELETE
:
if ($this->isGranted('POST_EDIT', $post)) {
// ...
}