使用 keycloak 在一个应用程序中单独访问

Separate access in one app with keycloak

我有以下设置 - Spring SAAS REST 服务,它允许不同的公司管理不同的事件。还有一个休息客户端(一个移动应用程序),每个公司单独发货。 我想使用 keycloak 来处理安全问题,我有一个问题是如何将一家公司与另一家公司分开。

我需要公司A不能访问公司B的事件,还需要公司内部的不同角色——有些可以创建事件,有些只能读取。

起初我以为每个公司都会在 keycloak 中创建自己的领域,但我了解到该领域实际上是在 spring 引导 REST 服务参数中指定的

keycloak.realm=demo-realm

这意味着每个 REST 应用程序只有一个领域。而且我不想为每个客户端配置 REST 服务实例。我只希望一个 REST 统治他们。

我是否在尝试使用不适合我的用例的东西?

为每个公司配置一个 keycloack 组,并以这样一种方式制定逻辑,使一个组的用户无法访问其他组创建的内容是否正确?但实际上感觉不对,因为据我了解组应该以不同的方式使用 - 拥有管理员组和用户组等,将用户 "vertically" 分隔为 "privileges",而不是 "horizontally".

能否请您提出解决此问题的正确方法?

我会实现一个自定义协议映射器,它会为您的应用程序加载额外的用户权限并将它们存储在令牌中。这样,您就可以使用单一领域,如果将来有更多公司,它可以很好地扩展。在这里,您了解了如何实施它。an example

基本上,访问令牌的 otherClaims 字段是一个允许设置属性映射的 JSON 字段。您可以在此处添加一个字段,例如:

userAccessibleCompanyIds: [1,3,4]

具体用户如何加载公司id?您可以从映射器访问您的应用程序数据库或使用 REST API.

获取它们

然后在您的应用程序中,您需要控制用户访问的内容。我所做的是解码令牌并查看用户请求是否适合。如果不是,return 403 响应。