如何在 Spring Boot WebFlux 中使用 GET 请求注销
Posted
技术标签:
【中文标题】如何在 Spring Boot WebFlux 中使用 GET 请求注销【英文标题】:How to logout with GET request in SpringBoot WebFlux 【发布时间】:2019-10-12 23:51:14 【问题描述】:如何配置securityWebFilterChain(ServerHttpSecurity http)
以便我的应用程序在GET /logout
上注销?
我有SpringBoot 2
Spring 5
和WebFlux
我试过了:
http
.logout()
.requiresLogout(ServerWebExchangeMatchers.pathMatchers(HttpMethod.GET, "/logout"))
.logoutSuccessHandler(logoutSuccessHandler("/after-life"))
问题是,LogoutPageGeneratingWebFilter
比发出的 SecurityWebFilterChain
中的 LogoutWebFilter
早。其中有一个硬编码的.pathMatchers(HttpMethod.GET, "/logout")
- 这导致我的应用程序总是在 GET 请求上发出一个 html 页面。
我发现没有办法抑制自动注销页面生成:(
【问题讨论】:
【参考方案1】:如文档中所述,
默认情况下,Spring Security 会在“/login”处生成登录页面,在“/logout”处生成注销页面。如果这是定制的: 不再提供默认的登录和注销页面 应用程序必须在提供的 URL 处呈现登录页面 应用程序必须在提供的 URL + "?error" 处呈现身份验证错误页面 POST 到提供的 URL 将进行身份验证
自定义配置具有默认登录和没有默认注销。
@Bean
public SecurityWebFilterChain securityWebFilterChain(ServerHttpSecurity httpSecurity)
LoginPageGeneratingWebFilter loginpage= new LoginPageGeneratingWebFilter();
loginpage.setFormLoginEnabled(true);
return httpSecurity
.addFilterAt(loginpage, SecurityWebFiltersOrder.LOGIN_PAGE_GENERATING)
.authorizeExchange()
.pathMatchers("/home").authenticated()
.and().formLogin()
.loginPage("/login")
.and()
.logout()
.logoutUrl("/logout").requiresLogout(ServerWebExchangeMatchers.pathMatchers(HttpMethod.GET, "/logout"))
.and()
.build();
【讨论】:
我检查过,这确实完全删除了注销页面,但并没有真正回答 如何配置 securityWebFilterChain(ServerHttpSecurity http) 以便我的应用程序在 GET /logout 上注销? @inquisitive 更新为需要注销匹配器,它工作正常。 你可以省略logoutUrl
,因为你用requiresLogout
重写它【参考方案2】:
我有同样的问题,但我使用的是 OAuth2Login,并且应用程序位于反向代理后面,去除了前缀并使用了 ForwardedHeaderTransformer
。一切正常,但注销页面具有硬编码路径/logout
,因此无法添加自定义前缀。我的解决方案是将注销网址更改为/logout-oidc
http.logout(logout -> logout
.requiresLogout(ServerWebExchangeMatchers.pathMatchers(HttpMethod.GET, "/logout-oidc"));
没有可以禁用LogoutPageGeneratingWebFilter
的方法setLogoutPageGenerating(boolean enable)
很糟糕
【讨论】:
以上是关于如何在 Spring Boot WebFlux 中使用 GET 请求注销的主要内容,如果未能解决你的问题,请参考以下文章
如何在 Spring Boot 和 Spring WebFlux 中使用“功能 bean 定义 Kotlin DSL”?
如何使用 WebFlux 在 Spring Boot 2 中设置登录页面?
如何使用WebFlux在Spring Boot 2中设置登录页面?
如何在没有 spring-boot 的情况下在 spring-webflux 中加载配置?
如何使用 Spring Boot 对 WebFlux 进行异常处理?
如何使用 Spring Boot Security 修复 Spring Boot Webflux 应用程序中的“名称为 requestMappingHandlerAdapter 的 bean 定义无效