gpt4 book ai didi

spring-security - 带 token 中继的 Spring Cloud Security : Response has empty set cookie header

转载 作者:行者123 更新时间:2023-12-05 03:55:19 26 4
gpt4 key购买 nike

我尝试构建一个最小的 openid 安全云环境。关注多多少少https://developer.okta.com/blog/2019/08/28/reactive-microservices-spring-cloud-gateway .

我有一个 spring 云网关、一个 consul 注册表、一个在 okta 上注册的应用程序和一个只有一个 Controller 返回字符串的简单测试应用程序。网关和测试应用程序都依赖于 'com.okta.spring',名称:'okta-spring-boot-starter',版本:'1.4.0'

网关配置如下(为简洁起见,此处跳过 ssl):

spring:
cloud:
loadbalancer:
ribbon:
enabled: false
gateway:
default-filters:
- TokenRelay
discovery:
locator:
enabled: true
okta:
oauth2:
issuer: ${OKTA_OAUTH2_ISSUER}
client-id: ${OKTA_OAUTH2_CLIENT_ID}
client-secret: ${OKTA_OAUTH2_CLIENT_SECRET}

我添加了一个最小的安全配置:

private final ReactiveClientRegistrationRepository clientRegistrationRepository;

@Bean
public SecurityWebFilterChain securityWebFilterChain(ServerHttpSecurity http) {
http
.redirectToHttps()
.and()
.authorizeExchange()
.pathMatchers("/login").permitAll()
.pathMatchers("/actuator/**").permitAll()
.anyExchange().authenticated()
.and()
.oauth2Login()
.and()
.logout(logout -> logout.logoutSuccessHandler(oidcLogoutSuccessHandler()))
.oauth2ResourceServer()
.jwt();
return http.build();
}

private ServerLogoutSuccessHandler oidcLogoutSuccessHandler() {
OidcClientInitiatedServerLogoutSuccessHandler oidcLogoutSuccessHandler =
new OidcClientInitiatedServerLogoutSuccessHandler(clientRegistrationRepository);

oidcLogoutSuccessHandler.setPostLogoutRedirectUri(URI.create("https://<my-uri>"));

return oidcLogoutSuccessHandler;
}

测试应用程序也在 application.yml 中配置了 okta openid,就像在网关中一样:

@Bean
public SecurityWebFilterChain securityWebFilterChain(ServerHttpSecurity http) {
http
.authorizeExchange()
.pathMatchers("/actuator/**").permitAll()
.anyExchange().authenticated()
.and()
.oauth2ResourceServer()
.jwt();

Okta.configureResourceServer401ResponseBody(http);

return http.build();
}

我的问题是:

当我删除 token 中继并保持测试应用程序不安全时,网关将成功进行授权并且响应包含一个 set-cookie header ,可用于后续请求以提供来自再次运行所有授权流程。

但是,通过 'org.springframework.cloud:spring-cloud-starter-security' 添加 token 中继(并配置为如上所示的默认过滤器),返回一个空集-cookie header ,因此每个要运行的请求都会抛出整个授权流程。

我尝试了不同的解决方法,比如手动配置 ReactiveOAuth2AuthorizedClientService。我的方法都更像是猜测。

最佳答案

事实证明,解决方案是从下游请求中删除 cookie header 。这可以通过向网关添加另一个默认过滤器来实现:

spring:
cloud:
gateway:
default-filters:
- TokenRelay=
- RemoveRequestHeader=Cookie

关于spring-security - 带 token 中继的 Spring Cloud Security : Response has empty set cookie header,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60252317/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com