【问题标题】:How to log out with spring security basic auth? [duplicate]如何使用 Spring Security 基本身份验证注销? [复制]
【发布时间】:2018-02-10 17:36:41
【问题描述】:

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

我在我的 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 错误。

我错过了什么?好像忘记了什么明显的事情……

【问题讨论】:

  • Basic 会随每个请求重新发送您的凭据。您的浏览器仍在发送它们。

标签: java spring spring-security


【解决方案1】:

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

=====

Spring security 默认提供一个 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 来找出原因。

【讨论】:

  • 虽然此链接可能会回答问题,但最好在此处包含答案的基本部分并提供链接以供参考。如果链接页面发生更改,仅链接答案可能会失效。 - From Review
  • 公平点。我已经更新了答案。
  • 这不会清除浏览器中的基本身份验证缓存,这是 OP 遇到的问题。
  • 这根本不能解决问题。如果您正在阅读本文,请忽略此答案。如果您在浏览器上/使用相同的浏览器而不关闭,则基本身份验证注销不起作用。
猜你喜欢
  • 2015-02-06
  • 2017-11-16
  • 2011-02-11
  • 2016-03-20
  • 1970-01-01
  • 2011-05-08
  • 2011-12-01
  • 2013-04-05
  • 2016-04-30
相关资源
最近更新 更多