如何使用 spring 安全基本身份验证注销?

Kir*_* Ch 6 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);
}
Run Code Online (Sandbox Code Playgroud)

如果我使用直接链接

http://localhost:.../j_spring_security_logout

我收到“未找到”错误。

我缺少什么?好像忘记了一些明显的事情……

hum*_*ngV 2

编辑:正如其他人指出的那样,OP 遇到的问题是由于 BasicAuth 标头造成的。下面的答案并不能解决问题。

=====

Spring security 默认提供一个 URL /logout

您可以使用WebSecurityConfigurerAdapter如下方式配置不同的 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()
            ...
    }
}
Run Code Online (Sandbox Code Playgroud)

以上是java配置。如果您使用 xml 命名空间配置,它将类似于以下内容:

<security:http>
        ...
        <security:logout logout-url="/app/logout" />
        ...
</security:http>
Run Code Online (Sandbox Code Playgroud)

更多信息可以在以下链接中找到:

现在,有趣的是为什么你的logoutMe4不起作用。我不知道答案。它似乎做了足够的事情来完成注销,但我不知道您的完整配置,因此可能有一些内容尚未清除/无效。无论如何,您应该使用受支持的配置来执行注销,而不是手动执行注销,但仍然可以通过检查 spring-security 源代码并查看该类如何LogoutConfigurer配置SecurityContextLogoutHandler.

  • 这不会清除浏览器中的基本身份验证缓存,这是 OP 遇到的问题。 (3认同)