我在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()
也没有改变任何内容。
您知道如何禁用此重定向吗?
答案 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);
});
});
}
哪个做得很好。我建议在logout()重写上执行此操作,主要是因为它(很好,它可以工作,但除此之外)保留了oauth2基本流程(/ oauth / revoke),而不是使用/ logout或类似的方法。
希望有帮助!