Spring Boot 3.2.2 和 Security 6.2.1 似乎要求我编写 OAuth2Provider 代码,在 Boot 2.5.6(Security 5.5.3)中我通过配置实现了 OAuth2 功能。
我的 Spring Boot 2.5.6 应用程序提供 Angular 客户端代码和 REST API,并使用单独的 Keycloak 23 安装通过 Oauth2 进行保护。一切正常。 Keycloak 在 application.yml 中配置。 Spring 显然会读取 oidc 端点,并使用正确的参数向 Keycloak 上的 OIDC 授权端点呈现任何未经身份验证的请求。客户端获得一个用于对抗服务器的令牌。 REST 端点可用。需要明确的是,这里是这个工作应用程序的 Maven pom 的一部分
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.5.6</version>
</parent>
...
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-oauth2-client</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-oauth2-resource-server</artifactId>
</dependency>
...
应用程序中的任何位置都没有配置授权授予类型或授权端点。众所周知的 oidc 配置端点已配置。我的服务器上没有登录/注销代码,也没有包含个人资料详细信息的用户服务。我不需要角色。我通过 M Steyer 的 angular-oauth2-oidc 库与客户端中的 Keycloak 进行交互。
我无法找出与当前 Spring Boot (3.2.2) 和 Maven 引入的依赖项(Security 6.2.1 等)等价的基本自配置设置。我看到的示例适用于多客户端用例,使用 CommonOauth2Providers,例如 GOOGLE、FACEBOOK、OKTA。客户都有客户秘密。我可以在 Keycloak 中设置机密访问并为我的客户获取秘密;有必要吗?我需要配置登录/退出、用户服务、客户端注册表、注册表管理器吗?我是否需要通过众所周知的 oidc 配置端点来配置工作应用程序在 Keycloak 上找到的信息?
我肯定不是第一个遇到这个问题的人,但我无法立即找到有关基本情况的现有讨论。感谢您的指点。
答案是肯定的,在 Spring Security 6.0 中可以使用 Keycloak/Oauth2,而无需编写 Oauth2 提供程序。
如果您在 Angular 中使用 OAuth2 客户端库(如
angular-oauth2-oidc
所示),那么:
spring-boot-starter-oauth2-client
在启动应用程序中几乎没有用(OAuth2 客户端是 Angular 应用程序)您可能应该在 Angular 应用程序和 REST API 之间插入 OAuth2 BFF。它将在会话 + CSRF 安全性(最终用户浏览器和后端之间)和令牌安全性(后端内部)之间架起桥梁。
有关 Spring OAuth2 配置的更多详细信息,请参阅 Spring Security 手册 或 我的教程。请注意,spring-cloud-gateway 是实现 BFF 的自然选择,它是一个reactive应用程序,并且要公开的安全 bean 与servlet所需的安全 bean 不同。