Spring安全性 - 禁用注销重定向

时间:2016-04-01 10:49:51

标签: java spring spring-security

我在REST中使用Spring安全性,并且我使用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()也没有改变任何内容。

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

7 个答案:

答案 0 :(得分:25)

以下代码适用于我(请注意,它没有logout().disable()

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

答案 1 :(得分:10)

因此,由于尚未接受答案,我发布了适用于我的解决方案:

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

成功退出后只需返回一个干净的HTTP_OK(200) - 在这种情况下,春天不会重定向你

答案 2 :(得分:2)

使用此方法:

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

答案 3 :(得分:1)

Foo使用XML配置的人,这里是Tahir Akhtar给出的等效片段。

RewriteEngine On # skip all rules below this for files and directories RewriteCond %{REQUEST_FILENAME} -f [OR] RewriteCond %{REQUEST_FILENAME} -d RewriteRule ^ - [L] RewriteRule ^([\w-.]+)/?$ index.php?id=$1 [L,QSA] RewriteCond %{DOCUMENT_ROOT}/site/map/$2 -f RewriteRule ^([\w-]+)/(.+)/?$ $2?id=$1&goto=$2 [L,QSA] RewriteCond %{DOCUMENT_ROOT}/site/map/$2/index.php -f RewriteRule ^([\w-.]+)/([a-z0-9]+)/?$ $2/index.php?id=$1&goto=$2 [NC,L,QSA] RewriteRule ^([\w-.]+)/([a-z0-9]+)/?$ index.php?id=$1&goto=$2 [NC,L,QSA] 元素中,按以下方式配置<http>元素:

<logout>

并定义<logout logout-url = "/some/path/for/logout" invalidate-session = "true" delete-cookies = "JSESSIONID" success-handler-ref = "httpStatusReturningLogoutSuccessHandler" /> bean如下:

httpStatusReturningLogoutSuccessHandler

答案 4 :(得分:1)

您可能想尝试这个

http.logout()。logoutRequestMatcher(new AntPathRequestMatcher(“/ thisistomisleadlogoutfilter”));

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

答案 5 :(得分:0)

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

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

答案 6 :(得分:0)

我用了这个:

    @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或类似的方法。

希望有帮助!