java - 如何在微服务架构中设置 Keycloak + Spring Boot + Oauth2
问题描述
我已经成功设置了 Keycloak 和一个公共/前端的 spring boot 应用程序。一切都按预期工作。前端Spring Boot App在Keycloak中配置为realm中的客户端(app-ui),用户可以通过keycloak登录,token传递成功,一切都很好。Spring Security 正在保护端点,并且端点的角色受到尊重。
现在,我正在尝试在组合中添加一个下游 Spring Boot 应用程序(Web 服务),我希望它知道登录用户能够保护对它的调用。前端 Spring Boot App 正在使用 Feign Client 调用后端 Spring Boot App 上的 REST 端点,但后端没有进行任何身份验证/授权。
我有几个问题我无法弄清楚:
- 如何设置前端 Spring Boot 应用程序以将经过身份验证的用户详细信息传递给后端 Spring Boot 应用程序(RequestInterceptor / RestTemplate / Feign config / Http Headers)?
- 如何配置后端 Spring Boot 应用程序以使用它从上游 Spring Boot 应用程序接收到的经过身份验证的用户详细信息,以及我需要向后端 Spring Boot 应用程序添加哪些依赖项以促进这一点(org.keycloak:keycloak -spring-boot-starter 和 org.springframework.boot:spring-boot-starter-security)?
- 我需要在 Keycloak 中为后端 Spring Boot App 配置什么吗?是否应该在 Keycloak 中注册为机密/非公开客户端(例如 app-api)?
- 在后端 Spring Boot App 中是否有任何特定的配置?它是否与 Keycloak 对话以验证它从上游调用者那里收到的经过身份验证的用户详细信息?
我很想看到一个演示或教程,它比我见过的How to integrate Keycloak and Spring Boot
更进一步,以保护任何其他下游服务。如果我能解决这个问题,我会发布一个。
我假设这可以通过后端 Spring Boot 应用程序上的标准 OAuth2 配置来完成,但我不确定如何建议实现此架构。
这是我正在尝试设置的架构:
解决方案
如何设置前端 Spring Boot 应用程序以将经过身份验证的用户详细信息传递给后端 Spring Boot 应用程序(RequestInterceptor / RestTemplate / Feign config / Http Headers)?
您需要在您的 http 请求标头中传递承载令牌。
如何配置后端 Spring Boot 应用程序以使用它从上游 Spring Boot 应用程序接收到的经过身份验证的用户详细信息,以及我需要向后端 Spring Boot 应用程序添加哪些依赖项以促进这一点(org.keycloak:keycloak -spring-boot-starter 和 org.springframework.boot:spring-boot-starter-security)?
您需要在领域中添加一个新客户端,例如“后端客户端”并将其“访问类型”设置为“仅承载”。您将需要 'keycloak-spring-boot-starter' 和 'spring-boot-starter-security' 依赖项,也在您添加的 'keycloak-adapter-bom' 中。在您的 application.properties 中,您应该具有以下提到的属性
keycloak.realm =
keycloak.auth-server-url = your keycloak url
keycloak.ssl-required =external
keycloak.bearer-only=true
keycloak.resource =your client name
keycloak.credentials.secret= your secret key
keycloak.security-Constraints[0].authRoles[0] = user
keycloak.security-Constraints[0].securityCollections[0].patterns[0] = /*
keycloak.cors=true
我需要在 Keycloak 中为后端 Spring Boot App 配置什么吗?是否应该在 Keycloak 中注册为机密/非公开客户端(例如 app-api)?
您需要创建一个新客户端,并且它应该注册为“仅承载”
你可以参考这个链接:https ://www.keycloak.org/docs/latest/securing_apps/#_spring_boot_adapter
推荐阅读
- java - 椭圆曲线资源
- react-native - 从 React-Native 中的数据文件中获取 uri props
- webcam - 如何在 Windows Media Foundation 中使用“H.264 UVC 1.5 相机编码器”
- java - 将 Maven 项目部署到 JBoss - 菜鸟问题
- javascript - 使用 JSON 文件构建 RESTful Node.js API 服务器时出错
- typescript - VueJs 使用日期(打字稿)和 v-model
- docker - 在 docker-compose 中向入口点添加参数
- ios - Xcode10.3 - Xib 无法拖放 UICollectionViewCell
- node.js - 为什么我在安装节点时收到 EBADPLATFORM 错误
- ios - React Native iOS Sentry - 阻止调用的参数太多,预期为 1,有 3