我们的堆栈包括以下服务,每个服务在docker容器中运行:
- React 中的前端
- 基于Spring boot"资源服务"的后端服务
- 钥匙斗篷
- 其他后端服务(使用者(
前端和使用者服务都使用 REST API 与后端通信。 我们使用Keycloak作为我们的用户管理和身份验证服务。
我们希望通过同时提供Web应用程序和服务流来将基于Spring的服务"资源服务"与Keycloak集成:
-
Web应用程序 - 基于React的前端发送,它应该从"资源服务"中获取重定向302,并发送用户/浏览器登录Keycloak站点,然后返回以获取请求的资源。
服务器 2 服务器协调 - 需要使用"资源服务"API 的服务器应该在身份验证问题而不是重定向/登录页面的情况下获得 401。
将Spring与Keycloak集成的选项很少:
- 钥匙斗篷弹簧靴适配器
- 钥匙斗篷弹簧安全适配器
- 春季安全性和 OAuth2
我注意到Keycloak文档中有一个"仅限自动检测承载者",它似乎完全支持这种情况。但- 有很多集成选项,我不确定对于新的 Spring 引导服务的最佳方法是什么。 此外,我没有找到在哪里配置该属性。
我使用了方法一和方法二,在我看来,如果您使用的是 Spring Boot,请使用相应的适配器,如果您仍在使用普通的 Spring MVC,请使用 Spring 安全适配器。我从未见过第三种方法的必要性,因为您基本上必须自己完成所有事情,为什么有人不使用前两种方法?
至于使用Spring Bood适配器,唯一需要的配置如下:
keycloak:
bearer-only: true
auth-server-url: your-url
realm: your-realm
resource: your-resource
大功告成。仅持有者是指在客户端到达时没有持有者令牌并且未按所需重定向到登录页面时返回 401。至少这对我们有用:-(
之后,您可以使用配置来保护端点,但使用 httpSecurity 或我们正在做的@EnableGlobalMethodSecurity会更灵活一些,例如 @Secured({"ROLE_whatever_role"}(。
如果您使用的是最新的Spring Boot版本与Spring Cloud结合使用,则可能会遇到此问题。
我将我的资源服务器配置为在标头丢失或无效Authorization
(并且永远不会返回 302(时始终返回 401,无论客户端如何。
客户端在需要时处理身份验证、令牌刷新等:一些经过认证的 OpenID 客户端库甚至提出了一些功能,以确保用户在向受保护资源发出请求之前具有有效的访问令牌。我最喜欢的 Angular 是 angular-auth-oidc-client,但我不知道哪个 React lib 具有相同的功能。
Spring 的 Keycloak 适配器现已弃用。您可以参考本教程了解各种资源服务器安全配置选项。它涵盖了从大多数简单的 RBAC 到构建 DSL 的用例,例如:@PreAuthorize("is(#username) or isNice() or onBehalfOf(#username).can('greet')")