如何在SpringBoot WebFlux中使用GET请求注销

时间:2019-05-27 11:46:51

标签: java spring-boot spring-security spring-webflux

如何配置securityWebFilterChain(ServerHttpSecurity http)以便我的应用程序在GET /logout上注销?

我有SpringBoot 2 Spring 5WebFlux

我尝试过:

  http
    .logout()
      .requiresLogout(ServerWebExchangeMatchers.pathMatchers(HttpMethod.GET, "/logout"))
      .logoutSuccessHandler(logoutSuccessHandler("/after-life"))

问题是,LogoutPageGeneratingWebFilter的位置早于发出的LogoutWebFilter中的SecurityWebFilterChain。那里有一个硬编码的.pathMatchers(HttpMethod.GET, "/logout")-使我的应用程序始终在GET请求中发出html页面。

我发现没有办法抑制自动注销页面的生成:(

2 个答案:

答案 0 :(得分: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();

    }

答案 1 :(得分:1)

我有同样的问题,但是我正在使用OAuth2Login,并且该应用程序位于反向代理后面,该反向代理通过剥离前缀并使用ForwardedHeaderTransformer。一切正常,但注销页面具有硬编码的路径/logout,因此无法添加自定义前缀。我的解决方案是将注销网址更改为/logout-oidc

http.logout(logout -> logout
            .requiresLogout(ServerWebExchangeMatchers.pathMatchers(HttpMethod.GET, "/logout-oidc"));

糟糕的是,没有方法setLogoutPageGenerating(boolean enable)可以禁用LogoutPageGeneratingWebFilter