微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

基于资源的RBAC实现思路

如何解决基于资源的RBAC实现思路

我需要在我的应用程序中实现一个非常复杂的 RBAC 模型。 它非常类似于 Azure RBAC:https://docs.microsoft.com/en-us/azure/role-based-access-control/overview

让我用一个例子来解释:

假设我有一个资源类型:server_group

然后我有角色:

  1. admin(可以对 CRUD 执行 server_group + 其他权限)
  2. editor(可以对 RU 执行 server_group + 其他权限)
  3. viewer(只能R server_group + 其他权限)

这些角色是租户范围的角色:此处的操作范围是当前用户注册所在的组织。

这是为资源类型分配角色权限的传统模型。

但是,如果您需要向具有 viewer 角色但在资源类型的特定实例范围内的特定用户授予更多权限,该怎么办?

Mark 是管理员,他创建了一个 server_group sg1,他想将 server_group_editor 的角色分配给 Alice,Alice 在租户范围内拥有 viewer角色。

server_group_editor 角色的适用范围为:server_group

server_group_editor 添加了更新 server_group 资源类型的功能

由于 Alice 在 server_group_editor 实例中担任 sg1 角色,因此她现在可以编辑此资源。

以前她不能这样做,因为她的租户范围权限允许她只列出所有服务器组。

我希望这是有道理的。

话虽如此,我很想知道是否有支持这种灵活 RBAC 模型的产品,是 SaaS 还是可以作为独立服务部署的应用程序?

我正在查看 Auth0、Okta、KeyCloak,但我看不到它们支持此模型。

提前致谢!

解决方法

我们在我工作的公司遇到了类似的问题。

我们使用 Auth0,但是内置的角色/权限功能并不能完全满足我们复杂的细粒度 authZ 要求 - 基本上我们需要能够处理可能属于一个或多个组的用户,但是每个组的权限不同。我们可以通过在 app_metadata 中存储复杂的权限结构,然后将其附加到用户访问令牌(通过 Auth0 规则)来解决这个问题,但我们预计这会变得笨拙...

我们通过构建内部“授权”微服务并在我们这边保留一些访问控制数据(即用户、组、角色和权限)解决了这个问题。

这是一个高级图: enter image description here

当用户注册时(使用与“IdpFacade”微服务对话的 Auth0 自定义通用登录页面),我们将一个事件发布到消息代理(Azure 服务总线)。此事件触发在“访问控制”数据存储(以及初始组、角色、权限关联)中创建用户。 注意:我们还可以通过 API 更新此数据存储(例如,如果我们想为用户动态分配额外的角色/权限)

当用户向启用权利的微服务发出请求时,我们会将细粒度的 authZ 决策推迟到权利服务。授权服务首先从数据存储中查询用户角色/权限(基于 JWT 主题,它本质上是来自 Auth0/IDP 的用户标识符)。然后,我们使用 Open Policy Agent 将此信息与 HTTP 方法、URI/资源路径和(可选)附加元数据(以键值对的形式)一起传递给 Overload input(又名 OPA)图案。 OPA 在名为 Rego 的 DSL 中定义所有 authZ 策略并进行决策。

来自“授权”服务的响应基本上是一个单一字段,指示应该允许还是拒绝访问。如果允许为 false,启用权利的微服务将返回 HTTP 403。供参考。我们在 .NET Core 中构建了一些样板来简化对权利的调用。下面是一个例子: enter image description here

[HttpPost]
[CheckEntitlement()]
public async Task<IActionResult> PostAsync(

注意:在属性中,我们可以指定策略名称以及(可选)元数据。

这种方法的优点:

  • 简化的 IDP 实施
  • 简化了微服务中的 authZ 逻辑,例如他们不需要了解复杂的 authZ 层次结构/要求,只需调用权限即可。
  • 解耦架构 - 能够在不接触微服务的情况下更新 authZ 策略。
  • 实时 authZ,即可以更新角色/权限并且更改将立即生效,而 JWT 中的权限在 JWT 到期之前一直有效。

我可能应该写一篇关于这种方法的详细博客,因为我认为这是一种非常好的方法(尽管最初需要一些设置)。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。