Spring security - 禁用注销重定向

Posted

技术标签:

【中文标题】Spring security - 禁用注销重定向【英文标题】:Spring security - Disable logout redirect 【发布时间】: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() 也不会改变任何东西。

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

【问题讨论】:

本文详细介绍了如何禁用注销重定向:baeldung.com/spring-security-disable-logout-redirects 【参考方案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 或类似的。

希望有帮助!

【讨论】:

以上是关于Spring security - 禁用注销重定向的主要内容,如果未能解决你的问题,请参考以下文章

防止 Spring Security 在登录/注销后进行 302 重定向

Spring security:注销时始终重定向到 invalid-session-url

使用 Spring Security 和 Grails 注销后如何将用户重定向到不同的页面

Spring Security 禁用登录页面/重定向

如何使用xml在spring security中禁用注销确认?

Spring Security:成功注销时重定向到 invalid-session-url 而不是 logout-success-url