2014-05-21 4 views
0

특정 기준에 따라 사용자를 프로그래밍 방식으로 로그인하는 필터를 구현하려고합니다. 프로그래밍 방식으로 Spring Security의 필터에 사용자 로그인

내 필터 방법 :

public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException { 
    HttpServletRequest request = (HttpServletRequest) servletRequest; 
    HttpServletResponse response = (HttpServletResponse) servletResponse; 
    Cookie[] cookies = request.getCookies(); 

    boolean typo3loggedin = true; 
    String memberNo = "100003"; 

    HttpRequestResponseHolder holder = new HttpRequestResponseHolder(request, response); 
    SecurityContext securityContext = contextRepository.loadContext(holder); 
    Authentication authentication = securityContext.getAuthentication(); 


    if (cookies != null && cookies.length > 0) { 
     for (int i = 0; i < cookies.length; i++) { 
      String name = cookies[i].getName(); 
      String value = cookies[i].getValue(); 
      if (name.equalsIgnoreCase("fe_typo_user")) typo3loggedin = true; // 
      logger.debug(String.format("cookie-name: %s, cookie-value: %s", name, value)); 
     } 
    } 

    if (typo3loggedin && (authentication == null || !authentication.isAuthenticated())) { 
     List<GrantedAuthority> grantedAuths = new ArrayList<GrantedAuthority>(); 
     grantedAuths.add(new SimpleGrantedAuthority("ROLE_USER")); 
     if (authentication == null) authentication = new UsernamePasswordAuthenticationToken(memberNo, "", grantedAuths); 
     securityContext.setAuthentication(authentication); 
     contextRepository.saveContext(securityContext, request, response); 
     logger.debug("Logged-in from typo3 as user " + memberNo); 
    } 

    filterChain.doFilter(servletRequest, servletResponse); 
} 

하지만 인증을 저장하려고 할 때마다, 나는 다음과 같은 오류 얻을 :

java.lang.ClassCastException: org.mortbay.jetty.Response cannot be cast to org.springframework.security.web.context.SaveContextOnUpdateOrErrorResponseWrapper 
      at org.springframework.security.web.context.HttpSessionSecurityContextRepository.saveContext(HttpSessionSecurityContextRepository.java:108) 
      at com.scaratec.bueroprint.mdb.ui.server.filter.SsoFilter.doFilter(SsoFilter.java:74) 
      at org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:343) 
      at org.springframework.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:260) 
      at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1212) 
      at org.springframework.orm.hibernate3.support.OpenSessionInViewFilter.doFilterInternal(OpenSessionInViewFilter.java:233) 
      at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) 
      at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1212) 
      at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:88) 
      at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) 
      at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1212) 
      at org.mortbay.jetty.servlet.ServletHandler.handle(ServletHandler.java:399) 
      at org.mortbay.jetty.security.SecurityHandler.handle(SecurityHandler.java:216) 
      at org.mortbay.jetty.servlet.SessionHandler.handle(SessionHandler.java:182) 
      at org.mortbay.jetty.handler.ContextHandler.handle(ContextHandler.java:766) 
      at org.mortbay.jetty.webapp.WebAppContext.handle(WebAppContext.java:450) 
      at org.mortbay.jetty.handler.ContextHandlerCollection.handle(ContextHandlerCollection.java:230) 
      at org.mortbay.jetty.handler.HandlerCollection.handle(HandlerCollection.java:114) 
      at org.mortbay.jetty.handler.HandlerWrapper.handle(HandlerWrapper.java:152) 
      at org.mortbay.jetty.Server.handle(Server.java:326) 
      at org.mortbay.jetty.HttpConnection.handleRequest(HttpConnection.java:542) 
      at org.mortbay.jetty.HttpConnection$RequestHandler.headerComplete(HttpConnection.java:928) 
      at org.mortbay.jetty.HttpParser.parseNext(HttpParser.java:549) 
      at org.mortbay.jetty.HttpParser.parseAvailable(HttpParser.java:212) 
      at org.mortbay.jetty.HttpConnection.handle(HttpConnection.java:404) 
      at org.mortbay.io.nio.SelectChannelEndPoint.run(SelectChannelEndPoint.java:410) 
      at org.mortbay.thread.QueuedThreadPool$PoolThread.run(QueuedThreadPool.java:582) 

는 예외 메시지 자체가 이해가되지 않습니다를 org.mortbay.jetty.Response이 으로 매개 변수로 취한 HttpServletResponse을 구현하기 때문에 나에게.

업데이트 : 아래 의견에 제안 된대로이 시나리오를 정확히 수행하기 위해 AbstractPreAuthenticatedProcessingFilter을 확장했습니다. 이것은 내 문제를 완전히 해결했습니다.

+1

자신의 롤링 대신 'AbstractPreAuthenticatedProcessingFilter'를 단순히 확장하는 것이 더 쉽지 않을까요? –

+0

@ M.Deinum 감사합니다! 이것은 실제로 내 문제를 해결했습니다. 나는이 필터를 인식하지 못했지만, 이것이 내가 필요한 것입니다. – Randy

답변

2

간단한 클래스 캐스트 문제처럼 보입니다. 요청 개체가 SaveContextOnUpdateOrErrorResponseWrapper의 인스턴스가 아닙니다. 이 클래스는 요청이 Spring Security 필터 체인을 통과 할 때이를 감싸는 데 사용합니다.이 요청은 SecurityContextPersistenceFilter에 의해 생성됩니다.

그것은 자신의 필터 클래스의 통화에서 SecurityContextRepository 유래에 대한 호출과 가 보안 필터 체인을 통과하지 한 요청과 같은 (스택 트레이스를보고 봄 보안 필터의 언급이 없음) . 따라서 요청 객체는 래퍼가 아닌 원래 컨테이너 유형입니다.

관련 문제