使用 keycloak 在一个应用程序中单独访问
Posted
技术标签:
【中文标题】使用 keycloak 在一个应用程序中单独访问【英文标题】:Separate access in one app with keycloak 【发布时间】:2018-03-22 00:31:04 【问题描述】:我有以下设置 - Spring SAAS REST 服务,它允许不同的公司管理不同的事件。还有一个休息客户端(一个移动应用程序),为每家公司单独发货。 我想将 keycloak 用于安全方面,但我有一个问题是如何将一家公司与另一家公司分开。
我需要 companyA 不能访问 companyB 事件,还需要公司内的不同角色 - 有些可以创建事件,有些只能读取它。
首先我以为每个公司都会在 keycloak 中创建自己的领域,但我了解到该领域实际上是在 spring boot REST 服务参数中指定的,例如
keycloak.realm=demo-realm
这意味着每个 REST 应用程序只有一个领域。而且我不想为每个客户端配置 REST 服务实例。我只想要一个 REST 规则。
我是否在尝试使用真正不适合我的用例的东西?
为每个公司配置一个 keycloack 组是否是正确的方法,并以这样一种方式制定逻辑,使一个组的用户无法访问其他组创建的内容。但实际上感觉不对,因为据我了解,组应该以不同的方式使用 - 拥有管理组和用户组等,通过“权限”“垂直”隔离用户,而不是“水平”。
您能否为这个问题提出一个正确的方法?
【问题讨论】:
【参考方案1】:我将实现一个自定义协议映射器,它为您的应用程序加载额外的用户权限并将它们存储在令牌中。这样,您可以使用单一领域,如果未来有更多公司,它可以很好地扩展。这里有 an example 的实现方法。
基本上,访问令牌的otherClaims
字段是一个允许设置属性映射的 JSON 字段。您可以在此处添加一个字段,例如:
userAccessibleCompanyIds: [1,3,4]
如何为具体用户加载公司 ID?您可以从映射器访问您的应用程序数据库或使用 REST API 获取它们。
然后在您的应用程序中,您需要控制用户访问的内容。我所做的是解码令牌并查看用户请求是否适合。如果不是,则返回 403 响应。
【讨论】:
以上是关于使用 keycloak 在一个应用程序中单独访问的主要内容,如果未能解决你的问题,请参考以下文章