如何在 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 2Spring 5WebFlux

我试过了:

  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 定义无效