使用 keycloak 服务器进行身份验证后,将自定义字段添加到网关上的当前用户

add custom fields to current user on gateway after authenticating with keycloak server

我们正在使用 Keycloak 服务器针对多个 IDPS(google、活动目录等)进行身份验证。我们有一个 spring 扮演客户端角色的网关微服务和扮演资源服务器角色的其他几个微服务。

当用户通过 keycloak 进行身份验证时,我们希望将经过身份验证的用户与我们自定义数据库(不是 Keycloak 数据库)中的一些自定义字段(如上下文、角色、用户详细信息)相关联,并将这些字段也发送到其他微服务,这样我们就不需要在每个微服务中从数据库中加载字段。

你会怎么做?在网关中创建一个 GlobalFilter,它将这些字段添加到请求 headers 并以某种方式将那些 headers 设置为资源服务器中的主体 object?或者使用缓存(redis)将字段存储在网关上并将它们加载到资源服务器中?或者您有其他解决方案吗?例如扩展访问令牌,覆盖 UserDetailsS​​ervice 等。

需要注意的重要一点是,我们不想扩展 Keycloak 数据库,因为我们希望在我们的自定义数据库中进行整个角色管理。原因是 keycloak 模式不是很灵活。我们只想将 keycloak 用作虚拟身份验证服务器。

安全相关值的首选选项是让 Keycloak 在令牌发布时访问您的 API 或自定义数据源,然后将您的域特定声明包含在 JWT 访问令牌中。在 keycloak 中,我相信这是通过协议映射器完成的,如 this answer.

本设计模式以Claims Best Practices article. It is recommended to not send secure values such as roles in custom headers etc, since they are potentially easier to change by a hostile party. Instead each API should receive the JWT and validate it, in a zero trust方式讨论,然后使用收到的声明进行授权。

对于非安全值,例如用于日志记录的 session_idcorrelation_id,简单的 HTTP headers 效果很好。