특정 기준에 따라 사용자를 프로그래밍 방식으로 로그인하는 필터를 구현하려고합니다. 프로그래밍 방식으로 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
을 확장했습니다. 이것은 내 문제를 완전히 해결했습니다.
자신의 롤링 대신 'AbstractPreAuthenticatedProcessingFilter'를 단순히 확장하는 것이 더 쉽지 않을까요? –
@ M.Deinum 감사합니다! 이것은 실제로 내 문제를 해결했습니다. 나는이 필터를 인식하지 못했지만, 이것이 내가 필요한 것입니다. – Randy