Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用spring security手动注销用户?_Spring_Spring Security_Logout - Fatal编程技术网

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

如何使用spring security手动注销用户?,spring,spring-security,logout,Spring,Spring Security,Logout,答案可能很简单:如何在SpringSecurity中手动注销当前登录的用户? 致电: SecurityContextHolder.getContext().getAuthentication().setAuthenticated(false); ?我很难确定您的代码是否足够。然而,标准SpringSecurity的注销实现是不同的。如果您查看一下SecurityContextLogoutHandler,您会发现它们是这样做的: SecurityContextHolder.clearC

答案可能很简单:如何在SpringSecurity中手动注销当前登录的用户? 致电:

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

我很难确定您的代码是否足够。然而,标准SpringSecurity的注销实现是不同的。如果您查看一下SecurityContextLogoutHandler,您会发现它们是这样做的:

    SecurityContextHolder.clearContext();
此外,它们还可以选择使HttpSession无效:

    if (invalidateHttpSession) {
        HttpSession session = request.getSession(false);
        if (session != null) {
            session.invalidate();
        }
    }
您可以通过查看找到更多信息。

您也可以使用as:

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

编辑

这需要
ConcurrentSessionFilter
(或链中的任何其他筛选器),该筛选器检查会话信息并调用所有注销处理程序,然后执行重定向。

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

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

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

...
...

我在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);
}
简单地这样做(那些被“关注你”评论的):


最近,我们不得不使用SpringSecurity3.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"/>

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

  • XXXLogoutHandler,它将实现org.springframework.security.web.authentication.logout.LogoutHandler并重写logout()方法
  • XXXLogoutSuccessHandler,它将实现org.springframework.security.web.authentication.logout.logoutsuccesshandler,并将重写onLoguoutSuccess()方法。在XXXLogoutSuccessHandler.onLogoutSuccess()方法中,调用redirectStrategy.sendRedirect()方法,将用户注销到特定的targetURL
  • org.springframework.security.web.authentication.logout.SecurityContextLogoutHandler执行使用户会话无效的任务
  • 希望这将有助于为初学者提供正确的方向


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

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

    根据(Spring 3.2):

    可以使用HttpServletRequest.logout()方法注销当前用户。

    通常这意味着SecurityContextHolder将被清除 一旦退出,HttpSession将无效,任何“记住我” 身份验证将被清除,等等


    new SecurityContextLogoutHandler().logout(请求,null,null)

    对了,我在我的控制器中使用以下示例来注销并将用户重定向到spring security 4.2.3中的登录页面

    SecurityContextHolder.clearContext();
    
    if(session != null)
        session.invalidate();
    
    return "redirect:/login";
    

    如果已经设置好了,你也会想放弃记忆cookie。非常感谢你的回答,伙计们,我会检查一下。这对我不起作用。它不像你说的那么简单。还有更多的配置详细信息吗?应该没有其他必要的配置使其工作。您只需将用户重定向到一个类似“”的URL即可。我让它工作,但我必须重新启动Tomcat使其开始工作。+1因为CookieClearningLogoutHandler,否则,如果用户有rememberme cookie,则可以重新登录。注意,这个类要求Spring3.1在Tomcat7的
    org.apache.catalina.connector.Request#logout
    实现中为Spring3.1.2/Grails2.2.0提供一个NPE。
    clearContext()
    @PavelLasov没有这样的错误。我相信这是spring配置中的一些错误,请阅读有关SecurityContextHolder的信息。在
    request.logout()之后,
    我仍然在
    SecurityContextHolder.getContext().getAuthentication()中拥有授权用户。
     <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"/>
    
    SecurityContextHolder.clearContext();
    
    if(session != null)
        session.invalidate();
    
    return "redirect:/login";