有人可以说这是一个重复的问题,但我已经查看了很多答案,尝试了一些方法但却无法理解我错过了什么。
我在REST服务器中使用非常基本的Spring Security。当我第一次直接从浏览器向我的服务器发出请求 localhost:... / getData 时,我当然会被要求授权。
然后服务器每次都允许此请求。我如何退出以便下次请求再次需要授权?
现在我尝试在我的服务器上使用多种方法进行注销:
@RequestMapping(value = "/logoutMe2", method = RequestMethod.GET)
public void logout2() {
SecurityContextHolder.getContext().setAuthentication(null);
}
@RequestMapping(value = "/logoutMe3", method = RequestMethod.GET)
public void logout3() {
SecurityContextHolder.clearContext();
}
@RequestMapping(value = "/logoutMe", method = RequestMethod.GET)
public void logout(HttpServletRequest rq, HttpServletResponse rs) {
SecurityContextLogoutHandler securityContextLogoutHandler =
new SecurityContextLogoutHandler();
securityContextLogoutHandler.logout(rq, rs, null);
}
@RequestMapping(value = "/logoutMe4", method = RequestMethod.GET)
public static void myLogoff(HttpServletRequest request, HttpServletResponse response) {
CookieClearingLogoutHandler cookieClearingLogoutHandler = new CookieClearingLogoutHandler(AbstractRememberMeServices.SPRING_SECURITY_REMEMBER_ME_COOKIE_KEY);
SecurityContextLogoutHandler securityContextLogoutHandler = new SecurityContextLogoutHandler();
cookieClearingLogoutHandler.logout(request, response, null);
securityContextLogoutHandler.logout(request, response, null);
}
如果我使用直接链接
我收到Not Found错误。
我缺少什么?似乎我忘记了一些明显的事情......
答案 0 :(得分:2)
=====
默认情况下,Spring安全性提供了一个URL /logout
。
您可以使用WebSecurityConfigurerAdapter
来配置不同的网址,如下所示:
@EnableWebSecurity
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
protected void configure(HttpSecurity http) throws Exception {
http
.logout()
.logoutUrl("/my/logout")
.logoutSuccessUrl("/my/index")
.logoutSuccessHandler(logoutSuccessHandler)
.invalidateHttpSession(true)
.addLogoutHandler(logoutHandler)
.deleteCookies(cookieNamesToClear)
.and()
...
}
}
以上是java配置。如果您使用的是xml命名空间配置,它将类似于以下内容:
<security:http>
...
<security:logout logout-url="/app/logout" />
...
</security:http>
更多信息可在以下链接中找到:
现在,有趣的是,logoutMe4
无法正常工作。我不知道答案。它似乎做了足够的事情来完成注销,但我不知道你的完整配置,所以可能有一些东西没有被清除/无效。您应该使用支持的配置来进行注销,而不是手动执行注销,但仍然可以通过查看spring-security源代码并查看LogoutConfigurer
类如何配置SecurityContextLogoutHandler
来找出原因。