Java 如何使用spring security basic auth注销?
有人可能会说这是一个重复的问题,但我看了很多答案,尝试了很多方法,但无法理解我错过了什么 我在REST服务器中使用非常基本的Spring安全性。当我第一次直接从浏览器向我的服务器发出请求,请求到localhost:…/getData时,我当然被要求授权 然后服务器每次都允许这个请求。如何注销,以便下次请求再次需要授权 现在我尝试在服务器上使用几种方法注销:Java 如何使用spring security basic auth注销?,java,spring,spring-security,Java,Spring,Spring Security,有人可能会说这是一个重复的问题,但我看了很多答案,尝试了很多方法,但无法理解我错过了什么 我在REST服务器中使用非常基本的Spring安全性。当我第一次直接从浏览器向我的服务器发出请求,请求到localhost:…/getData时,我当然被要求授权 然后服务器每次都允许这个请求。如何注销,以便下次请求再次需要授权 现在我尝试在服务器上使用几种方法注销: @RequestMapping(value = "/logoutMe2", method = RequestMethod.GET) publ
@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);
}
如果我使用直接链接
我收到一个未找到的错误
我错过了什么?似乎我忘记了一些显而易见的事情…编辑:正如其他人指出的,OP的问题是由于BasicAuth标题。下面的答案不能解决这个问题 ===== Spring security默认提供URL
/logout
您可以使用WebSecurityConfigureAdapter
配置不同的URL,如下所示:
@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>
...
...
更多信息可在以下链接中找到:
- Java配置的注销处理:
- Xml命名空间配置的注销处理:
现在,有趣的是,为什么您的
logoutMe4
不起作用。我不知道答案。它似乎做了足够多的事情来完成注销,但我不知道您的完整配置,因此可能有一些内容尚未清除/无效。无论如何,您都应该使用支持的配置来执行注销,而不是手动执行,但仍然可以通过检查spring security源代码来找出原因,并查看LogoutConfigurer
类如何配置SecurityContextLogoutHandler
Basic会在每次请求时重新发送您的凭据。您的浏览器仍在发送它们。虽然此链接可以回答问题,但最好在此处包含答案的基本部分,并提供链接以供参考。如果链接页面发生更改,仅链接的答案可能无效。-说得对。我已经更新了答案。这不会清除浏览器中的基本身份验证缓存,这是OP遇到的问题。这根本解决不了问题。如果你正在读这篇文章,忽略这个答案。如果您使用浏览器/使用同一浏览器而不关闭,则基本身份验证注销不起作用。