如何使用spring security手动注销用户?

Eri*_*rik 68 spring spring-security logout

可能答案很简单:如何在spring security中手动注销当前登录的用户?打电话是否足够:

SecurityContextHolder.getContext().getAuthentication().setAuthenticated(false); 
Run Code Online (Sandbox Code Playgroud)

Grz*_*zki 66

我很难确定你的代码是否足够.但是,标准的Spring-security的注销实现是不同的.如果你看一下SecurityContextLogoutHandler你会看到他们这样做:

    SecurityContextHolder.clearContext();
Run Code Online (Sandbox Code Playgroud)

此外,他们可选择使HttpSession无效:

    if (invalidateHttpSession) {
        HttpSession session = request.getSession(false);
        if (session != null) {
            session.invalidate();
        }
    }
Run Code Online (Sandbox Code Playgroud)

您可以在其他一些关于在Spring Security中注销并查看源代码的org.springframework.security.web.authentication.logout.SecurityContextLogoutHandler问题中找到更多信息.

  • 如果已设置,您还需要删除rememberme cookie. (2认同)

Pio*_*ler 37

在Servlet 3.0容器中,Spring注销功能与servlet集成,您只需调用logout()您的HttpServletRequest.仍然需要编写有效的响应内容.

根据文档(Spring 3.2):

HttpServletRequest.logout()方法可用于记录当前用户.

通常这意味着SecurityContextHolder将被清除,HttpSession将被无效,任何"记住我"身份验证将被清除,等等.

  • 在 `request.logout()` 之后,我仍然在 `SecurityContextHolder.getContext().getAuthentication()` 中拥有授权用户 (4认同)

小智 21

我在LogoutFilter中使用相同的代码,重用LogoutHandler如下:

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)

  • +1 因为 CookieClearingLogoutHandler 否则用户可以再次登录(如果她有 Rememberme cookie)。注意这个类需要 spring 3.1 (2认同)

Rit*_*esh 10

您还可以将SessionRegistry用作:

sessionRegistry.getSessionInformation(sessionId).expireNow();
Run Code Online (Sandbox Code Playgroud)

如果要强制在用户的所有会话中注销,请使用每个会话信息的getAllSessions方法和调用expireNow.

编辑
这就需要ConcurrentSessionFilter(或链中的任何其他过滤器),用于检查SessionInformation,并呼吁所有注销处理程序,然后执行重定向.


Jam*_*mes 10

要在Web应用程序中注销用户,您还可以将其重定向到注销页面.LogoutFilter然后为您完成所有工作.

注销页面的URL在安全配置中设置:

<sec:http ...>
  ...
  <sec:logout logout-url="/logout" logout-success-url="/login?logout_successful=1" />
  ...
</sec:http>
Run Code Online (Sandbox Code Playgroud)