2014-10-05 9 views
1

스프링 세션 버전 1.0.0.M1을 사용 중이며 MapSessionRepository을 사용하도록 구성했습니다. sessionFilterChainReg.addMappingForServletNames (EnumSet.of (DispatcherType.REQUEST)), false , dispatcherServletReg.getName());스프링 보안 csrf가 스프링 세션과 작동하지 않습니다.

final FilterRegistration sessionFilterChainReg = servletContext.addFilter("sessionFilter", DelegatingFilterProxy.class); 

그래서 내는 register.jsp에 다음과 같은 입력 숨겨진 요소가 있습니다 :

<input type="hidden" id="${_csrf.parameterName}" name="${_csrf.parameterName}" value="${_csrf.token}"/> 

을 내가 페이지를 가져 볼 수있는 웹 설정에서

@Bean(name = {"defaultSessionFilter", "sessionFilter"}) 
public SessionRepositoryFilter sessionFilter() { 
    return new SessionRepositoryFilter((SessionRepository) applicationContext.getBean("sessionRepository")); 
} 


@Bean(name = { "defaultSessionRepository", "sessionRepository" }) 
public SessionRepository defaultSessionRepository() { 
    return new MapSessionRepository(); 
} 

다음 올바른 CSRF 토큰으로 렌더링됩니다. 그렇게,

HttpSession session = request.getSession(false); 

지금 세션이 null 인 : 나는 CSRF 필터가 트리거되는 POST 요청을 제출하고 토큰이 HttpSessionCsrfTokenRepository:loadToken를 호출하고있는 필터에 제대로 전달되면이 라인 (66)에 우리는 볼 수 리포지토리가 null CSRF 토큰을 반환하면 MissingCsrfTokenException이 발생합니다. 구성해야 할 다른 것이 있습니까?

여기에 (더 많이있다,하지만 난이 그것의 관련 부분 추측) 라인 (66)을 타격 스택 트레이스의 :

at org.springframework.security.web.csrf.HttpSessionCsrfTokenRepository.loadToken(HttpSessionCsrfTokenRepository.java:66) 
    at org.springframework.security.web.csrf.CsrfFilter.doFilterInternal(CsrfFilter.java:75) 
    at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) 
    at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342) 
    at org.springframework.security.web.context.SecurityContextPersistenceFilter.doFilter(SecurityContextPersistenceFilter.java:87) 
    at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342) 
    at org.springframework.security.web.context.request.async.WebAsyncManagerIntegrationFilter.doFilterInternal(WebAsyncManagerIntegrationFilter.java:50) 
    at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) 
    at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342) 
    at org.springframework.security.web.access.channel.ChannelProcessingFilter.doFilter(ChannelProcessingFilter.java:144) 
    at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342) 
    at org.springframework.security.web.FilterChainProxy.doFilterInternal(FilterChainProxy.java:192) 
    at org.springframework.security.web.FilterChainProxy.doFilter(FilterChainProxy.java:160) 
    at org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:344) 
    at org.springframework.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:261) 
    at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1632) 
    at org.springframework.session.web.SessionRepositoryFilter.doFilterInternal(SessionRepositoryFilter.java:83) 
    at org.springframework.session.web.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:66) 
    at org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:344) 
    at org.springframework.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:261) 
    at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1632) 
+0

CSRF 지원은 CSRF 토큰이 포함 된보기를 준비 할 때까지 세션을 생성하지 않습니다. CSRF 토큰을 어디에서 사용하고 있습니까? CSRF 토큰이 포함 된 뷰 (예 : JSP, Thymeleaf 템플릿, 응답 헤더 등)가 필요합니다. 시도해 볼 또 다른 사항은 스프링 세션에서 작동하는지 여부입니다. –

+0

안녕하세요 롭, 질문을 업데이트했습니다. 예, 스프링 세션없이 완벽하게 작동하고 CSRF 토큰이 필터로 올바르게 전달되지만 세션은 HttpSessionCsrfTokenRepository에서 반환됩니다. loadToken : 66은 null입니다. –

+0

요청한 쿠키가 있는지 확인할 수 있습니까? https://github.com/spring-projects/spring-session/issues/34와 관련이있을 수 있습니다. 여러 세션 쿠키가 표시되면 모두 삭제하고 다시 시도해야합니다. –

답변

1

문제 발견 - 나 자신은 HttpServletRequest을 감싸 Filter을 가졌다 개체와 필터가 SessionRepositoryFilter 전에 실행되었습니다. 나는이 정확한지 모르겠지만 내가이 짓을 SessionRepositoryFilter 후 화재를 강제로 : 문제를 해결

@Bean(name = {"defaultSessionFilter", "sessionFilter"}) 
public Filter sessionFilter() { 
    CompositeFilter compositeFilter = new CompositeFilter(); 
    compositeFilter.setFilters(Arrays.asList(new SessionRepositoryFilter((SessionRepository) applicationContext.getBean("sessionRepository")), applicationContext.getBean("myFilter"))); 

    return compositeFilter; 
} 

합니다.