如何使用权限检查而不是角色检查来实现RBAC(在Spring中)

如何使用权限检查而不是角色检查来实现RBAC(在Spring中),spring,spring-security,permissions,rbac,role-base-authorization,Spring,Spring Security,Permissions,Rbac,Role Base Authorization,我一直在阅读如何实现基于角色的访问控制(RBAC),目的是在基于Spring的微服务API中实现它 在实现RBAC时,似乎应该检查权限,而不是角色。以下帖子似乎同意这一点: 上面第一个链接中选择的答案是“Spring安全和许多其他重要的访问控制机制传播了这种安全反模式”[检查角色而不是权限]。虽然只有3票赞成,但我不确定这一声明是否会被广泛接受 所以我想知道,如何在基于Spring的API中最好地实现RBAC,以便检查权限而不是角色 以以下场景为例: 我的应用程序中的用户可以具有角色计划

我一直在阅读如何实现基于角色的访问控制(RBAC),目的是在基于Spring的微服务API中实现它

在实现RBAC时,似乎应该检查权限,而不是角色。以下帖子似乎同意这一点:

  • 上面第一个链接中选择的答案是“Spring安全和许多其他重要的访问控制机制传播了这种安全反模式”[检查角色而不是权限]。虽然只有3票赞成,但我不确定这一声明是否会被广泛接受

    所以我想知道,如何在基于Spring的API中最好地实现RBAC,以便检查权限而不是角色

    以以下场景为例:

    我的应用程序中的用户可以具有角色
    计划管理器
    ,该角色可能具有权限
    查看计划
    创建计划
    编辑计划
    删除计划
    。在我们的应用程序中,我们允许一些用户更改与角色相关的权限,因此,例如,管理员用户可以编辑
    PLAN\u MANAGER
    角色上的权限,以删除
    DELETE\u PLAN
    权限

    在spring中,我将有一个
    deletePlan
    方法。我想知道只有当用户拥有
    DELETE\u PLAN
    权限时,如何允许用户执行此方法。看起来预授权检查是检查用户是否有权访问spring中的方法的标准方法,但是似乎最常用于预授权注释的是hasRole,而不是HasPermission

    我找不到使用仅引用权限的预授权检查的示例/教程,相反,引用角色似乎更常见(但是,下面的示例显示同时使用角色和权限检查)

    我发现的大多数例子似乎都是这样的:

    @PreAuthorize("hasRole('PLAN_MANAGER'))
    
    @PreAuthorize("hasPermission('DELETE_PLAN'))
    
    但是如果我使用这种方法,并且管理员用户从
    PLAN\u MANAGER
    角色中删除
    DELETE\u PLAN
    权限,那么我们将错误地允许用户执行
    deletePlan

    因此,我是否应该使用以下内容:

    @PreAuthorize("hasRole('PLAN_MANAGER'))
    
    @PreAuthorize("hasPermission('DELETE_PLAN'))
    
    因此,即使与角色关联的权限发生更改,此检查对于此特定方法始终有效,并且不需要更改代码。因此,可以使用DELETE_PLAN权限将新角色添加到应用程序中,我们不需要在代码中为这些新角色添加新的显式角色检查

    谢谢

    更新

    我发现这里似乎有人在做和我一样的事,看起来他在做回购交易

    下面粘贴的自述文件中显示了一个示例,它看起来正是我想要实现的——因此我似乎需要使用hasAuthority,而不是hasRole或hasPermission(hasPermission需要一个对象目标参数,我不想指定,因为这似乎超出了RBAC到ABAC,我只想指定一个权限/特权,这就是hasAuthority看起来合适的原因):


    (还发现了一篇较旧的帖子,详细介绍了另一种自定义方法,该方法看起来允许检查权限/权限,而不是角色-)

    我发现本教程使用了hasPermission概念,但它仅在hasRole之外使用它-因此我认为我们失去了仅检查权限所带来的价值:。因此我仍然不明白为什么没有任何spring示例只检查权限。也许我仍然可以实现仅检查权限的using例如Approach我也在SpringSecurity3中找到了这个老教程,它显示了在预授权注释中检查权限(而不是角色)的示例(作者提到的缺点是检查方法仍然命名为hasRole而不是hasPermission)在Spring OAuth中,我们有作用域。作用域本质上是权限IMHO。我发现本教程使用了hasPermission概念,但它仅在hasRole之外使用它-因此我认为我们失去了只检查权限的值:。因此我仍然不明白为什么没有任何Spring示例只检查pPermissions。也许我仍然可以使用Approach实现仅权限检查。我在SpringSecurity3中也找到了这篇老教程,其中展示了在预授权注释中检查权限(而不是角色)的示例(作者提到的缺点是check方法仍然命名为hasRole而不是hasPermission)在SpringOAuth中,我们有作用域。作用域本质上是权限IMHO。