2011-03-28 4 views
3

내 스프링 보안 3.0.5 웹 앱에서 사용자의 인증을 취소하고 (세션을 종료) 다른 사이트로 리다이렉트하여 로그 아웃을 알려줘야합니다. 봄 내에 가능합니까? 그렇다면 이러한 작업을 수행하는 일반적인 방법은 무엇입니까? 감사!맞춤 봄 보안 로그 아웃 필터

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

} 

}

java.lang.IllegalStateException 
    org.apache.catalina.connector.ResponseFacade.sendRedirect(ResponseFacade.java:463) 
    javax.servlet.http.HttpServletResponseWrapper.sendRedirect(HttpServletResponseWrapper.java:138) 
    org.springframework.security.web.context.SaveContextOnUpdateOrErrorResponseWrapper.sendRedirect(SaveContextOnUpdateOrErrorResponseWrapper.java:74) 
    com.dc.api.service.impl.DCSimpleUrlLogoutSuccessHandler.onLogoutSuccess(DCSimpleUrlLogoutSuccessHandler.java:24) 
    org.springframework.security.web.authentication.logout.LogoutFilter.doFilter(LogoutFilter.java:100) 
    org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:380) 
    org.springframework.security.web.context.SecurityContextPersistenceFilter.doFilter(SecurityContextPersistenceFilter.java:79) 
    org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:380) 
    org.springframework.security.web.FilterChainProxy.doFilter(FilterChainProxy.java:169) 
    org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:237) 
    org.springframework.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:167) 

답변

6

서브 클래스 SimpleUrlLogoutSuccessHandler 및 onLogoutSuccess를 오버라이드 (override)는() 리디렉션을 수행 할 수 있습니다.

같은 로그 아웃 성공 핸들러 구성 :

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

왜 내가 리디렉션에서 illegalState를 얻을지에 대한 아이디어가 있습니까? – c12

+0

은 일반적으로 리디렉션 전에 일부 출력이 전송되었음을 의미합니다. – sourcedelica

+0

리디렉션을 두 번 호출하면 IllegalStateException이 발생했습니다. 'response.sendRedirect ("/ https://secure05.pilot.principal.com/shared/members/corp/LogoutServlet")'및'response.sendRedirect ("/ dreamcatcher/auth/login.html");' – Jonathan

7

가 실제로 표시 "정답은"사용자 정의 logout success-handler 설정에 대한 것은 아니지만 LogoutFilter, 문제의 정의로.

<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> 

UPDATE : 일부 봄 코드를 읽은 후, 내가 발견, 또 하나 개의 기본 로그 아웃 핸들러가 있다는 것을 - RememberMeServices, 인터페이스 AbstractRememberMeServices implements LogoutHandler로 정의. 따라서 RememberMeServices을 사용하고 RememberMe 지원을 포함하여 사용자 정의 필터를 작성하려는 경우 로그 아웃 핸들러 목록에 RememberMeServices에 대한 참조를 추가해야합니다.