我目前正在致力于通过 Keycloak 保护使用 Angular 16 和 Spring Boot 3.2 的应用程序。为了实现这一目标,我添加了
spring-boot-starter-oauth2-client
和 spring-boot-starter-oauth2-resource-server
依赖项。我的目标是在后端实现authorization_code 流程,而不使用公共客户端。这是我当前的安全配置:
httpSecurity
.cors(Customizer.withDefaults())
.csrf(AbstractHttpConfigurer::disable)
.authorizeHttpRequests(this::getAuthorizeRequests)
.oauth2ResourceServer(oauth2 -> oauth2.jwt(Customizer.withDefaults()))
.oauth2Login(loginConfig ->
loginConfig.tokenEndpoint(Customizer.withDefaults()).userInfoEndpoint(Customizer.withDefaults())
)
.logout(Customizer.withDefaults())
.sessionManagement(manager -> manager.sessionCreationPolicy(SessionCreationPolicy.STATELESS));
还有我的财产:
spring.security.oauth2.resourceserver.jwt.issuer-uri=http://localhost:8000/auth/realms/timetable-local
spring.security.oauth2.client.provider.keycloak.issuer-uri=http://localhost:8000/auth/realms/my-realm
spring.security.oauth2.client.registration.keycloak.provider=keycloak
spring.security.oauth2.client.registration.keycloak.client-name=my-client
spring.security.oauth2.client.registration.keycloak.client-id=my-client
spring.security.oauth2.client.registration.keycloak.client-secret=secret
spring.security.oauth2.client.registration.keycloak.scope=openid,offline_access,profile
spring.security.oauth2.client.registration.keycloak.authorization-grant-type=authorization_code
当尝试访问需要授权的 API 端点时,我遇到一系列 HTTP 302 重定向,如下所示:
我正在寻求有关调整 Angular 和 Spring Boot 配置的建议,以将浏览器重定向到 Keycloak 登录页面,而不是将其作为 HTTP 请求处理。任何人都可以提供有关如何有效配置 Angular 和 Spring Boot 来实现此行为的指导或分享他们的经验吗?
预先感谢您的协助。
我想到的解决方案是更改Spring客户端发送的重定向的一些HTTP状态:使用到达单页应用程序代码的
2xx
范围内的内容(而不是由浏览器处理的3xx
)应用程序的前面)。
我在我的启动器中实现了这一点,并使用我在authorizationEdpoint
上配置的自定义重定向策略。这个入门程序简化了您在某些时候可能需要的许多其他功能的配置:让前端决定在登录后将用户重定向到哪里,正确提供 cookie CSRF 保护(这是强制性的,因为您的前端已获得会话授权,不是代币)等
顺便说一句,配置为客户端的 API
oauth2Login
扩展性很差(它基于切换实例时必须共享或恢复的会话)。推荐的替代方案是使用中间件作为客户端,其职责仅限于:
带有
spring-boot-starter-oauth2-client
和 TokenRelay=
过滤器的 Spring Cloud Gateway 非常适合这样的 BFF,我在 Baeldung 上写了关于这一点的教程。