如何注销spring security basic auth?

时间:2017-09-01 15:49:27

标签: java spring spring-security

有人可以说这是一个重复的问题,但我已经查看了很多答案,尝试了一些方法但却无法理解我错过了什么。

我在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);
}

如果我使用直接链接

  

http://localhost:.../j_spring_security_logout

我收到Not Found错误。

我缺少什么?似乎我忘记了一些明显的事情......

1 个答案:

答案 0 :(得分:2)

编辑:正如其他人所指出的那样,OP存在的问题是由于BasicAuth头。下面的答案不会解决问题。

=====

默认情况下,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来找出原因。