这是我昨天问过的Referencing non-parameter entries in config.yml问题的后续行动。
假设我们有更复杂的情况,每个实体都有一个.yml配置文件。在每个中都有security.role_hierarchy设置,其中包含与该实体相关的角色层次结构。像这样:
#user.yml
security:
role_hierarchy: &srh
ROLE_USER_SHOW: ~
ROLE_USER_LIST: ~
ROLE_USER_NEW: ~
ROLE_USER_EDIT_OWN: ~
ROLE_USER_EDIT: ROLE_USER_EDIT_OWN
ROLE_USER_SOFTDELETE_OWN: ~
ROLE_USER_SOFTDELETE: ROLE_USER_SOFTDELETE_OWN
ROLE_USER_DELETE: ~
ROLE_USER_FLAG: ~
ROLE_USER_ALL:
- ROLE_USER_SHOW
- ROLE_USER_LIST
- ROLE_USER_NEW
- ROLE_USER_EDIT
- ROLE_USER_DELETE
- ROLE_USER_SOFTDELETE
- ROLE_USER_FLAG
#group.yml
security:
role_hierarchy: &srh
ROLE_GROUP_SHOW: ~
ROLE_GROUP_LIST: ~
ROLE_GROUP_NEW: ~
ROLE_GROUP_EDIT: ~
ROLE_GROUP_DELETE: ~
ROLE_GROUP_ALL:
- ROLE_GROUP_SHOW
- ROLE_GROUP_LIST
- ROLE_GROUP_NEW
- ROLE_GROUP_EDIT
- ROLE_GROUP_DELETE
easy_admin:
entities:
Group:
form:
fields:
-
property: 'roles'
type: choice
type_options:
expanded: true
multiple: true
choices: *srh
但提供的解决方案仅将choices
与security.role_hierarchy
中的group.yml
相关联,因此仅引用ROLE_GROUP_*
个角色。
我希望为choices
提供security.role_hierarchy
的合并值,使其具有ROLES_USER_*
,ROLES_GROUP_*
和所有其他已定义的角色。
这可能吗?
答案 0 :(得分:1)
所以我自己设法做到了。
正如@Anthon所说,&
和*
在这里毫无用处。我们必须通过Symfony来做到这一点。方法如下:
我使用security.role_hierarchy
作为定义安全层次结构的合理点 - 以及应用程序中使用的角色列表。我将选择字段留给未定义的选项,如下所示:
-
property: 'roles'
type: choice
type_options:
expanded: true
multiple: true
然后我在控制器中使用一个方法来设置选择:
// AppBundle/Controller/AdminController.php
public function indexAction(Request $request)
{
$choices = [];$preferred = [];
$vals = array_keys($this->container->getParameter('security.role_hierarchy.roles'));
$choices = $vals;
// actually there is some beautifying of $choices but it's not that important
// get $formBuilder and...
$formBuilder->add('roles', ChoiceType::class, ['choices'=>array_combine($choices, $vals), 'multiple'=>true, 'expanded'=>false]);
return $formBuilder;
}
我停止了$formBuilder
创建,因为我是以适合EasyAdmin的方式完成的,所以在其他情况下会有其他方法来实现。
可能还有另一种方法可以做到这一点,但它很麻烦:在控制器中获取security.role_hierarchy
,根据需要处理它,然后将其分配给Twig全局变量:
// AppBundle/Controller/AdminController.php
public function indexAction(Request $request)
{
$vals = array_keys($this->container->getParameter('security.role_hierarchy.roles'));
$this->container->get('twig')->addGlobal("_security_roles", $vals);
// ...
}
然后更新适当的Twig模板。
但我不喜欢不必要的全局,所以没有广泛测试它。