如何在 Spring Boot 微服务架构中使用 Keycloak 实现 JWT?

Posted

技术标签:

【中文标题】如何在 Spring Boot 微服务架构中使用 Keycloak 实现 JWT?【英文标题】:How to implement JWT with Keycloak in Spring boot microservice acrhitecture? 【发布时间】:2019-07-15 04:16:36 【问题描述】:

我已经阅读了一些关于 Keycloak spring 实现的文章(例如:easily-secure-your-spring-boot-applications-with-keycloak),但没有人提到如何与 JWT 一起使用。

我已经创建了 zuul api 网关并添加了 Keycloak 适配器,如之前链接的文章中所述。没关系,但我想将 JWT 与 keycloak 一起使用。

在别处提到将客户端访问类型设置为仅承载,将会话策略设置为 NullAuthenticatedSessionStrategy。这已经足够了还是需要 JWT 的其他东西?

所以我的问题:

如何在 Keycloak 管理员上为 JWT 配置客户端? 如何在 JWT 的后端配置文件中配置 Keycloak? 如何为 JWT 配置 Keycloak 适配器? 如何将用户信息传递给微服务?在网关中创建过滤器?但是我如何从请求中获取用户信息?

【问题讨论】:

【参考方案1】:

Keycloak 访问令牌是JWT。它是JSONJSON 中的每个字段都称为claim。默认情况下,登录的usernameaccess token 中名为“preferred_username”claim 中返回。 Spring Security OAuth2 资源服务器期望用户名在名为 “user_name”claim 中。因此,您需要创建映射器以将登录的 username 映射到名为 user_name 的新 claim

为了提供对客户端(微服务)的访问,需要将各自的role 分配/映射到user

在你的spring boot应用程序中,你需要配置与keycloak服务器的连接,提供auth url、token url、scopegrant-typeclient-idclient-secret

之后,您的应用能够解析 JWT 令牌,您需要创建一些 JwtAccessTokenCustomizer。这个类应该扩展DefaultAccessTokenConverter 并实现JwtAccessTokenConverterConfigurer 类。主要逻辑在于public OAuth2Authentication extractAuthentication(Map<String, ?> tokenMap)方法。

然后需要配置OAuth2 Resource Server,为其他微服务提供访问权限。为此,您在此处定义 - Oauth2RestTemplate Bean。

最后,通过标准配置 Component 保护您的 REST API。

所以,你可以看到,这是一个很大的工作,不能用代码来描述,展示你的一些工作,把它分成块,然后问你有趣的问题。

【讨论】:

以上是关于如何在 Spring Boot 微服务架构中使用 Keycloak 实现 JWT?的主要内容,如果未能解决你的问题,请参考以下文章

Spring-Boot:Spring Cloud构建微服务架构

如何使用Spring Boot/Spring Cloud 实现微服务应用

Spring Boot微服务架构和大数据

架构微服务 Spring Boot

使用 Spring Boot 的微服务中的安全问题

一文读懂Spring Boot微服务架构和大数据治理之间的故事