Keycloak授权服务属于数十个用户的数十个资源

Keycloak Authorization Services for dozens of resources which belong to dozens of users

我目前正在尝试弄清楚 Keycloak 授权服务器提供的 Authorization Services 是否是我保护我的应用程序所需要的东西。

所以我有一个 Python Rest API,它有(为了简单起见)可以创建、修改、删除等(通常的 CRUD 内容)的作业对象。 到目前为止,API 完全没有受到保护,我们需要一些 Auth 才能上线。 我决定使用 Keycloak,因为它已经在我们公司设置好,并使用 OAuth2 授权代码流和 OIDC 连接后端和前端到授权服务器。

现在用户可以登录到网络应用程序客户端,然后使用访问令牌对 Python 后端进行处理。 授权过程运行良好,令牌得到验证,我什至想出了如何获取范围并在后端验证它们。

现在我读到了有关授权服务的内容,我想知道我是否可以使用它来控制/映射哪个作业属于哪个 (Keycloak) 用户。像这样:

/api/job/job-nr-1   <-> user-id-5 (create, delete, etc)
/api/job/job-nr-1   <-> user-id-1 (read-only)
/api/job/job-nr-2   <-> user-id-3 
...

如果我理解正确的话,每个作业都是一个资源,用户可以做的事情(创建、删除等)就是范围。

但是将每个作业映射到一个用户实际上可能吗? 我是否需要为每个作业 <-> 用户关系设置策略以允许一个(且仅一个)用户编辑此作业? 这可以通过 API 完成吗?作业是动态创建的,因此我无法通过管理员自己执行此操作 UI。

这听起来很有效,我想知道 Keycloak 是否是管理它的正确位置,或者我是否应该为这些权限/关系设置一个单独的数据库。

除了范围之外,动态授权几乎总是涉及使用声明:

你的场景

感觉您需要类似于以下的属性/声明来实现您的授权,其中一些是特定于域的并且可能经常更改:

  • 用户编号
  • 角色
  • 与角色关联的权限

设计你的范围

范围是高级静态值,例如 'jobs_read' 和 'jobs_write'。它们代表一个数据区域并允许对该数据进行操作。

设计您的声明

声明是运行时值,例如用户拥有的权限,在用户通过身份验证后查找。

管理索赔

将数据存储在正确的位置,然后您将能够更轻松地随着时间的推移进行更改:

  • 通用身份数据应存储在 Keycloak
  • 域特定/易变数据应存储在您的业务数据中

授权

这里有两个技巧:

  • 颁发令牌时从授权服务器伸出手,从业务数据中获取声明并将它们包含在访问令牌中

  • 如果第一个选项不可行,则根据访问令牌

    中的用户 ID 在 API 中查找值

文档

在 Curity,我们喜欢解释这方面的科学原理 - 以一种对任何提供者都适用的方式 - 请参阅 this article 示例。