Java Spring安全-禁用注销重定向
我将spring安全性与REST结合使用,并将URL(Java Spring安全-禁用注销重定向,java,spring,spring-security,Java,Spring,Spring Security,我将spring安全性与REST结合使用,并将URL(/logout)用作注销方法的端点。但是调用此方法后,它将我重定向到(/login?logout),我知道这是springlogOutSuccessUrl。我想摆脱重定向。这是我的代码: protected void configure(HttpSecurity http) throws Exception { http.authorizeRequests() .antMatchers("/login").perm
/logout
)用作注销方法的端点。但是调用此方法后,它将我重定向到(/login?logout
),我知道这是springlogOutSuccessUrl
。我想摆脱重定向。这是我的代码:
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()
也不会改变任何东西
您知道如何禁用此重定向吗?使用此方法:
.logout().logoutSuccessUrl("enter address here where you want to go after logout")
以下代码适用于我(请注意,它没有
logout().disable()
)
对于那些使用XMLConfig的人来说,下面是与所给代码相同的代码段 在
元素中,按如下方式配置
元素:
<logout
logout-url = "/some/path/for/logout"
invalidate-session = "true"
delete-cookies = "JSESSIONID"
success-handler-ref = "httpStatusReturningLogoutSuccessHandler"
/>
<bean
id = "httpStatusReturningLogoutSuccessHandler"
class = "org.springframework.security.web.authentication.logout.HttpStatusReturningLogoutSuccessHandler"
/>
你可能想试试这个 http.logout().logoutRequestMatcher(新的AntPathRequestMatcher(“/ThisisToMissLeadLogoutFilter”)
这会有效地将/ThisisToMissLeadLogoutFilter重定向到login?logout。因此,您应该能够使用/logout来代替,因此,由于还没有公认的答案,我发布了我的解决方案,该解决方案对我有效:
.logout()
.logoutUrl("/api/user/logout")
.permitAll()
.logoutSuccessHandler((httpServletRequest, httpServletResponse, authentication) -> {
httpServletResponse.setStatus(HttpServletResponse.SC_OK);
})
.and()
成功注销后只需返回一个干净的HTTP_OK(200)-在这种情况下spring不会重定向您对于logoutSuccessXXX()操作,不要忘记添加permitAll(),因为调用logout()方法后cookie被清除。因此,我的示例解决方案是:
http
......
.and()
.logout()
.logoutUrl("/logout")
.logoutSuccessUrl("/logoutSuccess")
**.permitAll()**
我用了这个:
@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或类似的方法
希望有帮助 OP想要摆脱重定向,因为正在从REST客户端(可能是来自浏览器的AJAX请求)调用/logout。问题是禁用重定向,而不是将其更改为其他url。尝试将spring安全性的日志记录级别设置为debug,这可能会给您一个提示。如果使用SpringBoot,您可以向应用程序添加
logging.level.org.springframework.security=DEBUG
。properties@uncallable你让它工作了吗?我也有类似的问题。尝试了所有的解决方案,但没有任何效果。我使用的是spring security 4.2.0.RELEASE和XML配置,它可以工作。我们不需要显式地传递OK,这是默认值。伙计,你让我开心了。非常感谢,这应该是公认的答案。本文详细介绍了如何禁用注销重定向:
@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);
});
});
}