【问题标题】:How to store and use inherited roles in Symfony?如何在 Symfony 中存储和使用继承的角色?
【发布时间】:2016-11-18 13:01:18
【问题描述】:

我正在尝试在我的 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);
}

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

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

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

衷心感谢任何指导。

【问题讨论】:

    标签: symfony security inheritance roles


    【解决方案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();
            } 
    

    【讨论】:

    • 如何在表单生成器类中进行签到?
    • 这是相同的想法,但要抛出异常添加您的新字段:` if ($this->container->get('security.authorization_checker')->isGranted('ROLE_XXXXX')) { $form->add('name', 'text', array('label' => 'xxxxx' )); }`
    • 当我尝试使用您的建议检查角色时,我收到容器的“通知:未定义属性:”。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-03-30
    • 2021-01-17
    • 1970-01-01
    • 2021-06-25
    • 1970-01-01
    • 2012-08-16
    • 1970-01-01
    相关资源
    最近更新 更多