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安全注销过滤器_Spring_Spring Security - Fatal编程技术网

自定义Spring安全注销过滤器

自定义Spring安全注销过滤器,spring,spring-security,Spring,Spring Security,我需要在我的SpringSecurity3.0.5Web应用程序中取消对用户的身份验证(终止他们的会话),然后将重定向发送到另一个站点,通知他们注销。这在spring中是否可能?如果可能,执行这些任务的一般方法是什么?谢谢 import org.springframework.security.core.Authentication; import org.springframework.security.web.authentication.logout.SimpleUrlLogoutSucc

我需要在我的SpringSecurity3.0.5Web应用程序中取消对用户的身份验证(终止他们的会话),然后将重定向发送到另一个站点,通知他们注销。这在spring中是否可能?如果可能,执行这些任务的一般方法是什么?谢谢

import org.springframework.security.core.Authentication;
import org.springframework.security.web.authentication.logout.SimpleUrlLogoutSuccessHandler;

import com.dc.api.model.Users;

public class DCSimpleUrlLogoutSuccessHandler extends SimpleUrlLogoutSuccessHandler{

    public void onLogoutSuccess(javax.servlet.http.HttpServletRequest request, 
            javax.servlet.http.HttpServletResponse response,
            Authentication authentication)
     throws java.io.IOException,
            javax.servlet.ServletException{
            Users user=null;
            Object principal = authentication.getPrincipal();
            if (principal instanceof Users) {
                user = (Users) principal;
                if(user.getType().equals(TEST)){
                    response.sendRedirect("LogoutServlet");
                }
            }
            response.sendRedirect("login.html");

}
}


子类SimpleRullogoutSuccessHandler并重写onLogoutSuccess()以执行重定向

按如下方式配置注销成功处理程序:

<http>
  ...
  <logout success-handler-ref="myLogoutSuccessHandler"/>
</http>

...
实际上,标记的“正确答案”是关于设置自定义的
注销成功处理程序
,而不是
注销过滤器
,如所述

因此,如果有人想要创建自定义注销过滤器,下面是一个代码段:

<bean id="securityContextLogoutHandler" class="org.springframework.security.web.authentication.logout.SecurityContextLogoutHandler"/>
<bean id="logoutFilter" class="org.springframework.security.web.authentication.logout.LogoutFilter">
    <property name="filterProcessesUrl" value="/logout"/>
    <constructor-arg index="0" value="/"/>
    <constructor-arg index="1">
        <list>
            <ref bean="securityContextLogoutHandler"/>
            <!--ref bean="myLogoutHandler"/-->
        </list>
    </constructor-arg>
</bean>

这是一个带有一个默认预定义处理程序的默认筛选器类(这是一个使会话无效的处理程序)。 如果您确实需要自定义注销过滤器,那么您应该更改此标准行为(将其子类化或使用相同的接口编写自己的)。 也不要忘记注册它:

    <security:http>
....
        <custom-filter position="LOGOUT_FILTER" ref="logoutFilter"/>
    </security:http>

....
更新
在阅读了一些spring代码后,我发现还有一个默认的注销处理程序-,它是由接口
AbstractMemberServices实现LogoutHandler
定义的。因此,如果您正在使用
RememberMeServices
并希望编写一个包含RememberMe支持的自定义筛选器,您还需要在注销处理程序列表中添加对您的
RememberMeServices
的引用。

您知道我为什么会在重定向中获得非法状态吗?这通常意味着在重定向之前发送了一些输出。非法状态异常是由于调用重定向两次而导致的<代码>响应。发送重定向(“https://secure05.pilot.principal.com/shared/members/corp/LogoutServlet");和
response.sendRedirect(“/dreamcatcher/auth/login.html”)
    <security:http>
....
        <custom-filter position="LOGOUT_FILTER" ref="logoutFilter"/>
    </security:http>