Java 如何使用spring security basic auth注销?

Java 如何使用spring security basic auth注销?,java,spring,spring-security,Java,Spring,Spring Security,有人可能会说这是一个重复的问题,但我看了很多答案,尝试了很多方法,但无法理解我错过了什么 我在REST服务器中使用非常基本的Spring安全性。当我第一次直接从浏览器向我的服务器发出请求,请求到localhost:…/getData时,我当然被要求授权 然后服务器每次都允许这个请求。如何注销,以便下次请求再次需要授权 现在我尝试在服务器上使用几种方法注销: @RequestMapping(value = "/logoutMe2", method = RequestMethod.GET) publ

有人可能会说这是一个重复的问题,但我看了很多答案,尝试了很多方法,但无法理解我错过了什么

我在REST服务器中使用非常基本的Spring安全性。当我第一次直接从浏览器向我的服务器发出请求,请求到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);
}
如果我使用直接链接

我收到一个未找到的错误


我错过了什么?似乎我忘记了一些显而易见的事情…

编辑:正如其他人指出的,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遇到的问题。这根本解决不了问题。如果你正在读这篇文章,忽略这个答案。如果您使用浏览器/使用同一浏览器而不关闭,则基本身份验证注销不起作用。