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

时间:2011-04-20 08:13:29

标签: spring spring-security logout

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

SecurityContextHolder.getContext().getAuthentication().setAuthenticated(false); 

9 个答案:

答案 0 :(得分:63)

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

    SecurityContextHolder.clearContext();

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

    if (invalidateHttpSession) {
        HttpSession session = request.getSession(false);
        if (session != null) {
            session.invalidate();
        }
    }

您可以查看更多信息in some other question about logging out in Spring Security并查看the source code of org.springframework.security.web.authentication.logout.SecurityContextLogoutHandler

答案 1 :(得分:33)

在Servlet 3.0容器中,Spring注销功能与servlet集成,您只需在logout()上调用HttpServletRequest即可。仍然需要编写有效的回复内容。

根据documentation (Spring 3.2):

  

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

     

通常这意味着将清除SecurityContextHolder   out,HttpSession将失效,任何“记住我”   身份验证将被清除,等等。

答案 2 :(得分:19)

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

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

答案 3 :(得分:10)

您也可以使用SessionRegistry作为:

sessionRegistry.getSessionInformation(sessionId).expireNow();

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

修改
这需要ConcurrentSessionFilter(或链中的任何其他过滤器),它检查SessionInformation并调用所有注销处理程序,然后进行重定向。

答案 4 :(得分:10)

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

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

<sec:http ...>
  ...
  <sec:logout logout-url="/logout" logout-success-url="/login?logout_successful=1" />
  ...
</sec:http>

答案 5 :(得分:2)

简单地这样做(由“关注你”评论的那些):

    Authentication auth = SecurityContextHolder.getContext().getAuthentication(); // concern you

    User currUser = userService.getUserById(auth.getName()); // some of DAO or Service...

    SecurityContextLogoutHandler ctxLogOut = new SecurityContextLogoutHandler(); // concern you

    if( currUser == null ){
        ctxLogOut.logout(request, response, auth); // concern you
    }

答案 6 :(得分:2)

最近我们不得不使用Spring-security 3.0.5实现注销功能。虽然上面已经回答了这个问题,但我会发布完整的代码,这肯定会对像我这样的新手用户有所帮助:)。

Spring-security.xml中的配置

 <http auto-config="false" lowercase-comparisons="false" use-expressions="true">
     <custom-filter position="LOGOUT_FILTER" ref="logoutFilter" />
 </http>

<beans:bean id="logoutFilter" class="org.springframework.security.web.authentication.logout.LogoutFilter">
        <beans:constructor-arg name="logoutSuccessHandler" ref="xxxLogoutSuccessHandler" />
    <beans:constructor-arg name="handlers">
        <beans:list>
            <beans:ref bean="securityContextLogoutHandler"/>
            <beans:ref bean="xxxLogoutHandler"/>
        </beans:list>
    </beans:constructor-arg>
    <beans:property name="filterProcessesUrl" value="/logout"/>
</beans:bean>
<beans:bean id="XXXLogoutSuccessHandler" class="com.tms.dis.sso.XXXLogoutSuccessHandler"/>
<beans:bean id="securityContextLogoutHandler" class="org.springframework.security.web.authentication.logout.SecurityContextLogoutHandler">
    <beans:property name="invalidateHttpSession" value="true"/>
</beans:bean>
<beans:bean id="XXXLogoutHandler" class="com.tms.dis.sso.XXXLogoutHandler"/>

这里我创建了两个自定义类

  1. XXXLogoutHandler将实现org.springframework.security.web.authentication.logout.LogoutHandler,并将覆盖logout()方法。
  2. XXXLogoutSuccessHandler将实现org.springframework.security.web.authentication.logout.LogoutSuccessHanlder并将覆盖onLoguoutSuccess()方法。在XXXLogoutSuccessHandler.onLogoutSuccess()方法中,调用redirectStrategy.sendRedirect()方法,该方法将用户注销到特定的targetURL。
  3. org.springframework.security.web.authentication.logout.SecurityContextLogoutHandler执行使用户会话无效的任务。
  4. 希望这会有所帮助,并为启动器提供正确的方向

    注意:故意没有发布自定义实现的代码。

答案 7 :(得分:2)

new SecurityContextLogoutHandler().logout(request, null, null);

答案 8 :(得分:0)

Right Oledzki,我在我的控制器中使用以下内容注销并将用户重定向到spring security 4.2.3中的登录页面

SecurityContextHolder.clearContext();

if(session != null)
    session.invalidate();

return "redirect:/login";