【问题标题】:How to logout with GET request in SpringBoot WebFlux如何在 Spring Boot WebFlux 中使用 GET 请求注销
【发布时间】: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 页面。

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

【问题讨论】:

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


    【解决方案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)很糟糕

    【讨论】:

      猜你喜欢
      • 2020-02-07
      • 2020-04-02
      • 2020-08-11
      • 2021-04-20
      • 2021-09-19
      • 1970-01-01
      • 2020-04-26
      • 2021-06-12
      • 2018-11-03
      相关资源
      最近更新 更多