Spring Keycloak 身份验证 - 为 Web 应用程序和 Web 服务提供服务

Posted

技术标签:

【中文标题】Spring Keycloak 身份验证 - 为 Web 应用程序和 Web 服务提供服务【英文标题】:Spring Keycloak authentication - serves both web application and web service 【发布时间】:2020-04-23 18:41:24 【问题描述】:

我们的堆栈包括以下服务,每个服务都运行在一个 docker 容器中:

React 中的前端 基于Spring boot“resource-service”的后端服务 钥匙斗篷 其他后端服务(消费者)

前端和消费者服务都使用 REST API 与后端进行通信。 我们使用 Keycloak 作为我们的用户管理和身份验证服务。

我们希望通过为 Web 应用程序和服务流提供服务,将基于 Spring 的服务“resource-service”与 Keycloak 集成:

    Web 应用程序 - 基于 React 的前端发送应从“资源服务”获取重定向 302,并发送用户/浏览器登录 Keycloak 站点,然后返回以获取请求的资源。

    Server 2 Server coomunication - 需要使用“resource-service”API 的服务器在出现身份验证问题时应该得到 401,而不是重定向/登录页面。

将 Spring 与 Keycloak 集成的选项很少:

    Keycloak Spring Boot 适配器 Keycloak Spring 安全适配器 Spring Security 和 OAuth2

我注意到 Keycloak 文档中有一个“仅自动检测承载”,它似乎完全支持这种情况。但 - 有很多集成选项,对于新的 Spring 引导服务,我不确定最好的方法是什么。 另外,我没有找到在哪里配置该属性。

【问题讨论】:

【参考方案1】:

我使用了方法一和二,在我看来,如果您使用的是 Spring Boot,请使用相应的适配器,如果您仍在使用普通的 Spring MVC,请使用 Spring Security 适配器。我从未见过第三种方法的必要性,因为您基本上必须自己做所有事情,为什么有人不使用前两种方法?

至于使用 Spring Bood 适配器,唯一需要的配置如下:

keycloak:
  bearer-only: true
  auth-server-url: your-url
  realm: your-realm
  resource: your-resource

你就完成了。 Bearer-only 是为了让您返回 401,如果客户端到达时没有持有者令牌并且没有按照您的需要重定向到登录页面。至少这对我们有用:-)

之后,您可以使用配置来保护端点,但使用 httpSecurity 或 @EnableGlobalMethodSecurity 会更灵活一些,我们正在使用 e。 G。 @Secured("ROLE_whatever_role")。

如果您使用结合 Spring Cloud 的最新 Spring Boot 版本,您可能会遇到this issue。

【讨论】:

感谢您的详细回复!我现在了解如何处理 server2server 通信,但是如何使用仅承载类型将前端客户端 UI 重定向到 keycloak 登录页面?另外,能否请您告诉我您使用的 Spring boot / Keycloak 适配器库的版本是什么? 除了我之前的评论,我的理解是授权代码授权是基于浏览器的客户端的推荐方式。那么,我们如何将您的方法用于基于浏览器的客户端?

以上是关于Spring Keycloak 身份验证 - 为 Web 应用程序和 Web 服务提供服务的主要内容,如果未能解决你的问题,请参考以下文章

Spring应用程序基本身份验证通过keycloak

Keycloak 和 Spring Boot 身份验证错误

Spring Boot 我无法切换 keycloak 和基本身份验证

如何在 Spring Boot 应用程序中测试 Keycloak 身份验证?

无法使用 keycloak 构建基于 spring 的项目进行身份验证

在 spring-boot 中禁用特定 url 的 Keycloak 身份验证