Spring Keycloak authentication - serves both web application and web service
我们的堆栈包括以下服务,每个服务都运行在一个 docker 容器中:
- React 中的前端
- 基于Spring boot"resource-service"的后端服务
- 钥匙斗篷
- 其他后端服务(消费者)
前端和消费者服务都使用 REST API 与后端进行通信。
我们使用 Keycloak 作为我们的用户管理和身份验证服务。
我们希望通过为 Web 应用程序和服务流提供服务来将基于 Spring 的服务"资源服务"与 Keycloak 集成:
Web 应用程序 - 基于 React 的前端发送,应该从"资源服务"获取重定向 302,并发送用户/浏览器登录 Keycloak 站点,然后返回以获取请求的资源。
Server 2 Server coomunication - 需要使用"resource-service"API 的服务器在出现身份验证问题时应该得到 401,而不是重定向/登录页面。
将 Spring 与 Keycloak 集成的选项很少:
我注意到 Keycloak 文档中有一个"autodetect-bearer-only",它似乎完全支持这种情况。但 -
有很多集成选项,对于新的 Spring 引导服务,我不确定最好的方法是什么。
另外,我没有找到配置该属性的位置。
我使用了方法一和二,在我看来,如果您使用的是 Spring Boot,请使用相应的适配器,如果您仍在使用普通的 Spring MVC,请使用 Spring Security 适配器。我从未见过第三种方法的必要性,因为您基本上必须自己做所有事情,为什么有人不使用前两种方法?
至于使用 Spring Bood 适配器,唯一需要的配置如下:
1 2 3 4 5 | keycloak: bearer-only: true auth-server-url: your-url realm: your-realm resource: your-resource |
你就完成了。仅承载是这样,如果客户端到达时没有承载令牌并且没有按照您的需要重定向到登录页面,您将返回 401。至少这对我们有用:-)
之后,您可以使用配置来保护端点,但使用 httpSecurity 或 @EnableGlobalMethodSecurity 会更灵活一些,我们正在使用 e。 G。 @Secured({"ROLE_whatever_role"}).
如果您使用最新的 Spring Boot 版本并结合 Spring Cloud,您可能会遇到这个问题。