在 Spring Security 6.0 中是否可以在不编写 Oauth2 提供程序的情况下使用 Keycloak/Oauth2

问题描述 投票:0回答:1

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-boot spring-security oauth-2.0 keycloak openid-connect
1个回答
0
投票

答案是肯定的,在 Spring Security 6.0 中可以使用 Keycloak/Oauth2,而无需编写 Oauth2 提供程序。

如果您在 Angular 中使用 OAuth2 客户端库(如

angular-oauth2-oidc
所示),那么:

  • 授权代码流程配置应在 Angular 应用程序中完成,而不是 Spring 应用程序
  • 您不能使用“机密”客户端:在最终用户设备上运行的应用程序无法保守秘密,必须配置为“公共”客户端
  • spring-boot-starter-oauth2-client
    在启动应用程序中几乎没有用(OAuth2 客户端是 Angular 应用程序)
  • 从 Angular 到 Spring REST API 的请求使用访问令牌进行授权(Spring 应用程序应配置为资源服务器,在 Keycloak 作为授权服务器的情况下,最有可能使用 JWT 解码器)
  • 您正在应用的东西现在被认为是最糟糕的做法(如果您不想阅读所有帖子,请直接跳到最终建议

您可能应该在 Angular 应用程序和 REST API 之间插入 OAuth2 BFF。它将在会话 + CSRF 安全性(最终用户浏览器和后端之间)和令牌安全性(后端内部)之间架起桥梁。

有关 Spring OAuth2 配置的更多详细信息,请参阅 Spring Security 手册我的教程。请注意,spring-cloud-gateway 是实现 BFF 的自然选择,它是一个reactive应用程序,并且要公开的安全 bean 与servlet所需的安全 bean 不同。

© www.soinside.com 2019 - 2024. All rights reserved.