如何使用权限检查而不是角色检查来实现RBAC(在Spring中)
我一直在阅读如何实现基于角色的访问控制(RBAC),目的是在基于Spring的微服务API中实现它 在实现RBAC时,似乎应该检查权限,而不是角色。以下帖子似乎同意这一点: 上面第一个链接中选择的答案是“Spring安全和许多其他重要的访问控制机制传播了这种安全反模式”[检查角色而不是权限]。虽然只有3票赞成,但我不确定这一声明是否会被广泛接受 所以我想知道,如何在基于Spring的API中最好地实现RBAC,以便检查权限而不是角色 以以下场景为例: 我的应用程序中的用户可以具有角色如何使用权限检查而不是角色检查来实现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,以便检查权限而不是角色 以以下场景为例: 我的应用程序中的用户可以具有角色计划
计划管理器
,该角色可能具有权限查看计划
,创建计划
,编辑计划
,删除计划
。在我们的应用程序中,我们允许一些用户更改与角色相关的权限,因此,例如,管理员用户可以编辑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。