数十个用户的数十个资源的Keycloak授权服务
Posted
技术标签:
【中文标题】数十个用户的数十个资源的Keycloak授权服务【英文标题】:Keycloak Authorization Services for dozens of resources which belong to dozens of users 【发布时间】:2021-08-01 01:09:21 【问题描述】:我目前正在尝试确定 Keycloak 授权服务器提供的 Authorization Services 是否是我需要保护我的应用程序的东西。
所以我有一个 Python Rest API,它有(为了简单起见)可以创建、修改、删除等的作业对象(通常是 CRUD 的东西)。 到目前为止,API 完全不受保护,我们需要一些 Auth 才能使其上线。 我决定使用 Keycloak,因为它已经在我们公司进行了设置,并使用 OAuth2 授权代码流和 OIDC 连接了后端和前端到授权服务器。
所以现在用户可以登录到 web-app 客户端,然后使用访问令牌对 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
...
如果我理解正确的话,每个 Job 都是一个资源,而用户可以做的事情(创建、删除等)就是范围。
但是实际上可以将每个作业映射到一个用户吗? 我是否需要为每个作业 用户关系设置策略以允许一个(且只有一个)用户编辑此作业? 这可以通过 API 完成吗?作业是动态创建的,因此我无法通过管理 UI 自己执行此操作。
这听起来很有效,我想知道 Keycloak 是否是管理这个的正确地方,或者我是否应该为这些权限/关系设置一个单独的数据库。
【问题讨论】:
【参考方案1】:动态授权几乎总是涉及在范围之外使用声明:
您的场景
感觉您需要类似于以下内容的属性/声明来实现您的授权,其中一些是特定于域的并且可能经常更改:
用户 ID 角色 与角色相关的权限设计您的范围
范围是高级静态值,例如“jobs_read”和“jobs_write”。它们代表一个数据区域以及允许对该数据进行的操作。
设计您的索赔
声明是运行时值,例如用户拥有的权限,在用户通过身份验证后查找。
管理索赔
将数据存储在正确的位置,这样您就可以更轻松地随着时间的推移进行更改:
通用身份数据应存储在 Keycloak 中 域特定/易失性数据应存储在您的业务数据中授权
这里有两种技术:
在颁发令牌时从授权服务器伸出援手,从业务数据中获取声明并将其包含在访问令牌中
如果第一个选项不可行,则根据访问令牌中的用户 ID 在 API 中查找值
文档
在 Curity,我们喜欢解释这方面的科学性 - 以适用于任何提供商的方式 - 请参阅 this article 了解工作示例。
【讨论】:
感谢您提供的信息丰富的回答。明天我将通读这篇文章,看看是否可以使用 Keycloak 直接从 AS 获得这些声明。我不太确定如何在我的业务数据库中正确存储这些声明,但也许这篇文章也解释了。 酷 - 我会说这取决于规则的复杂性。人们有时从授权服务器中的所有规则开始 - 或者有时将角色和权限等表添加到他们自己的数据中。两者都没有错 - 选择的解决方案通常取决于规则的复杂程度,以及您是否认为多个应用程序会相互冲突。但至少值得了解身份数据和业务数据之间的逻辑分离。以上是关于数十个用户的数十个资源的Keycloak授权服务的主要内容,如果未能解决你的问题,请参考以下文章
GitHub:黑客盗用 OAuth 令牌,导致数十个组织数据泄露