【问题标题】:Spring security - Disable logout redirectSpring security - 禁用注销重定向
【发布时间】:2016-07-21 03:31:13
【问题描述】:

我正在使用带有 REST 的 Spring Security,并且我正在使用 URL (/logout) 作为我的注销方法的端点。但是调用这个方法后,它把我重定向到(/login?logout),我知道这是春天logOutSuccessUrl。我想摆脱重定向。这是我的代码:

protected void configure(HttpSecurity http) throws Exception {

    http.authorizeRequests()
         .antMatchers("/login").permitAll()
         .anyRequest().fullyAuthenticated()
         .and().requiresChannel().anyRequest().requiresSecure()
         .and().httpBasic().disable().logout()
         .disable()
       //  .logoutSuccessHandler(new HttpStatusReturningLogoutSuccessHandler(HttpStatus.OK))
          .csrf().disable();

}

我尝试使用HttpStatusReturningLogoutSuccessHandler,但它不起作用,即使设置logoutSuccessUrl() 也不会改变任何东西。

您知道如何禁用此重定向吗?

【问题讨论】:

标签: java spring spring-security


【解决方案1】:

以下代码对我有用(注意它没有logout().disable()

http.logout().permitAll();
http.logout().logoutSuccessHandler((new HttpStatusReturningLogoutSuccessHandler(HttpStatus.OK)));

【讨论】:

  • 尝试设置 spring security 的日志级别来调试,它可能会给你一个提示。如果使用spring boot,可以在application.properties中添加logging.level.org.springframework.security=DEBUG
  • @uncallable 你让它工作了吗?我有类似的问题。尝试了所有解决方案,没有任何效果。
  • 我正在使用带有 XML 配置的 spring-security 4.2.0.RELEASE 并且它可以工作。
  • 我们不需要明确地传递 OK 它是默认值。
【解决方案2】:

因此,由于还没有公认的答案,因此我发布了对我有用的解决方案:

.logout()
.logoutUrl("/api/user/logout")
.permitAll()
.logoutSuccessHandler((httpServletRequest, httpServletResponse, authentication) -> {
    httpServletResponse.setStatus(HttpServletResponse.SC_OK);
})
.and()

在成功注销后返回一个干净的 HTTP_OK (200) - 在这种情况下 spring 不会重定向你

【讨论】:

  • 老兄,你成就了我的一天。非常感谢,这应该是公认的答案。
【解决方案3】:

Foo那些使用XML配置的人,这里是Tahir Akhtar给出的等效sn-p。

<http>元素内,配置<logout>元素如下:

<logout
    logout-url          = "/some/path/for/logout"
    invalidate-session  = "true"
    delete-cookies      = "JSESSIONID"
    success-handler-ref = "httpStatusReturningLogoutSuccessHandler"
/>

并定义httpStatusReturningLogoutSuccessHandler bean如下:

<bean
    id      = "httpStatusReturningLogoutSuccessHandler"
    class   = "org.springframework.security.web.authentication.logout.HttpStatusReturningLogoutSuccessHandler"
/>

【讨论】:

    【解决方案4】:

    使用这个方法:

    .logout().logoutSuccessUrl("enter address here where you want to go after logout")
    

    【讨论】:

    • OP 希望摆脱重定向,因为 /logout 正在从 REST 客户端调用(可能是来自浏览器的 AJAX 请求)
    • 问题是禁用重定向,而不是将其更改为不同的 url。
    【解决方案5】:

    你可能想试试这个

    http.logout().logoutRequestMatcher(new AntPathRequestMatcher("/thisistomisleadlogoutfilter"));

    这有效地将 /thisistomisleadlogoutfilter 重定向到 login?logout。因此,您应该能够使用 /logout 代替

    【讨论】:

      【解决方案6】:

      对于 logoutSuccessXXX() 操作,不要忘记添加 permitAll(),因为调用 logout() 方法后 cookie 会被清除。所以我的示例解决方案是:

      http
         ......
         .and()
             .logout()
                 .logoutUrl("/logout")
                 .logoutSuccessUrl("/logoutSuccess")
                 **.permitAll()**
      

      【讨论】:

        【解决方案7】:

        我用过这个:

            @ResponseStatus(HttpStatus.NO_CONTENT)
        @PostMapping(value = "/oauth/revoke")
        public void revokeToken(Authentication authentication) {
            ofNullable(authentication).ifPresent(auth -> {
                OAuth2AccessToken accessToken = tokenStore.getAccessToken((OAuth2Authentication) auth);
        
                ofNullable(accessToken).ifPresent(oAuth2AccessToken -> {
                    ofNullable(oAuth2AccessToken.getRefreshToken()).ifPresent(tokenStore::removeRefreshToken);
                    tokenStore.removeAccessToken(accessToken);
                });
            });
        }
        

        From this gist

        效果很好。我建议在 logout() 覆盖上执行此操作,主要是因为它(嗯,它可以工作,但除此之外)保留了 oauth2 基本流程 (/oauth/revoke) 而不是使用 /logout 或类似的。

        希望有帮助!

        【讨论】:

          猜你喜欢
          • 2016-07-05
          • 1970-01-01
          • 2011-12-08
          • 2018-10-13
          • 2014-08-11
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2017-07-13
          相关资源
          最近更新 更多