我应该如何使用Keycloak为"role-less"(ACL,ABAC)REST API设置授权?



我的推理是基于这样一个前提,即在安全性方面,人们不应该重新发明轮子,最好研究哪种可用的解决方案最适合。

假设您有一个应用程序,允许用户创建内容并允许他们的朋友以某种方式更改它们。 我想在这种情况下使用基于角色的方法不会很好地工作,并且像每件事的访问控制列表这样的东西更接近理想。

按照我在第一段中提出的前提,我研究了Keycloak的文档,以寻找类似于ACL的东西,因为我还需要一个身份验证机制。至少可以说,我无法想出一个不让人感到"黑客"的解决方案......

与其写一个详尽的清单来表达我的想法,我想问一下:

  • 我的推理正确吗?
  • Keycloak真的是我想要的,还是我应该将它与casbin之类的东西一起使用?
  • 你会如何解决这个问题?

谢谢!

编辑(14/05/20(

为了进一步讨论这个主题,我将提供一个更具体(尽管简单(的示例。我还将分享Keycloak的主要贡献者的一些建议。

假设我们正在开发一个简单的 Medium 克隆,允许用户共同编辑文章。 Lance 是一个已经注册并经过身份验证的用户,他想开始写一篇关于自行车的文章,所以他导航到我们 SPA 中的"编辑屏幕"。 然后Lance给它一个标题,写几个单词,然后点击"创建"按钮,将POST请求发送到资源服务器(已经受到Keycloak保护(。然后,资源服务器(服务(将: 1. 将文章保存到数据库; 2. 通过 Keycloak 的保护 API 创建一个资源,其所有者属性设置为 Lances 的用户 ID 和一个空的"编辑器"属性。

后来兰斯决定也听取他的朋友克里斯的意见,因此将他添加到编辑名单中。 这也可以通过Keycloak的保护API来完成。

然后,这种设置将允许我们设置基于 JavaScript 的策略来保护进一步的编辑。

你的推理是正确的,因为它实际上符合"资源"的定义。作为您自己的应用程序资源服务器,Keycloak 提供访问或不访问它的授权,具体取决于您的考虑因素。

我想您的具体案例包含在用户托管访问中:

例如,假设用户 Alice(资源所有者(使用 网上银行服务(资源服务器(管理他的银行账户 (资源(。有一天,爱丽丝决定向鲍勃开设她的银行账户 (请求方(,会计专业人员。但是,鲍勃应该 只能查看(范围(爱丽丝的帐户。

作为资源服务器,网上银行服务必须能够 保护爱丽丝的银行账户。为此,它依赖于Keycloak资源 注册终结点,用于在服务器中创建表示的资源 爱丽丝的银行账户。

此时,如果鲍勃尝试访问爱丽丝的银行帐户,请访问 将被拒绝。网上银行服务定义了一些默认值 银行账户政策。其中之一是只有所有者,在 在这种情况下,爱丽丝被允许访问她的银行帐户。

但是,网上银行服务也涉及爱丽丝的隐私 允许她更改银行账户的特定策略。其中之一 她可以改变的这些政策是定义哪些人是 允许查看她的银行帐户。为此,网上银行服务 依靠Keycloak为爱丽丝提供了一个空间,她可以选择 个人及其被允许访问的操作(或数据(。 Alice 可以随时撤销访问权限或授予其他权限 给鲍勃。

对于你的情况,资源就是事物,你的应用程序需要在资源注册终结点中注册它。然后,您可以使用策略来定义访问资源以及如何访问资源。

从我在问题(编辑后(中提到的贡献者那里了解到的情况来看,这种推理是正确的,这是可以做到的一种方式。此外,正如@Xtreme Biker所说,我们还可以利用Keycloak提供的UMA功能来让用户管理他们的资源。

贡献者还表示,应该权衡开销,此解决方案的重复可能会增加并考虑使细粒度授权更接近应用程序/资源服务器/服务。

最新更新