如何在Symfony中存储和使用继承的角色?

时间:2016-07-15 10:39:45

标签: symfony security inheritance roles

我正在尝试在Symfony3应用程序中实现角色。

我对继承的角色有困难。我将每个用户的角色保存到用户表中的角色列。我没有将继承的角色保存到数据库中。

我的User实体中的getRoles()函数从角色列返回角色,但这不会检索继承的角色。

如何确保getRoles()还以优雅的方式返回继承的角色?我尝试了以下方法:

public function getRoles()
{
    $roles = $this->roles;

    // ensure the inherited roles from role heirarchy are added accordingly
    switch ($roles[0]){
        case 'ROLE_SUPER_ADMIN':
            $roles[] = 'ROLE_AGENCY_ADMIN';
            $roles[] = 'ROLE_CLIENT_ADMIN';
            $roles[] = 'ROLE_ADMIN';
            break;
        case 'ROLE_AGENCY_ADMIN':
        case 'ROLE_CLIENT_ADMIN':
            $roles[] = 'ROLE_ADMIN';
            break;
    }

    $roles[] = 'ROLE_USER';
    return array_unique($roles);
}

这可以按预期工作,但我觉得有更好的选择。安全分析器告诉我以下内容: enter image description here

所以我在角色部分也有继承角色,对我来说似乎不对。如果安全分析器知道继承的角色,那么我应该能够访问该信息而不是自己将其混合在一起吗?

我一直在搜寻SO以寻找合适的解决方案,但到目前为止已经难倒了。

真诚地感谢任何指导。

1 个答案:

答案 0 :(得分:1)

您可以创建新的roles.yml文件,您将在其中定义新的role_hierarchy:

security:
    role_hierarchy:

        ROLE_SUPER_ADMIN:
            - ROLE_ALLOWED_TO_SWITCH
            - ROLE_VIEW_HOME_OVERVIEW
            - ROLE_ADMIN

        ROLE_ADMIN:

            - ROLE_VIEW_HOME_OVERVIEW
            - ROLE_VIEW_CALENDAR_OVERVIEW
            - ROLE_VIEW_ADMIN_OVERVIEW_L .......

不要忘记将其添加到config.yml文件

imports:
        - { resource: roles.yml }

现在您可以直接在您的控制器中查看:

  if (!$this->get('security.authorization_checker')->isGranted('ROLE_VIEW_HOME_OVERVIEW')) {
            throw new AccessDeniedException();
        }