2014-02-13 4 views
4

스프링 보안 3.2.0으로 업그레이드하고 xml을 구성한 후 _csrf 토큰이 작동하지 않습니다.스프링 보안 3.2.0 freemarker 템플릿에서 csrf 토큰이 작동하지 않습니다.

기본 :

  • 봄 4.0.1
  • 봄 보안 3.2.0.
  • 프리 마커 템플릿 언어

1 단계 - 스프링 보안 XML 구성 :

<!-- enable csrf protection via csrf-element --> 
<sec:http> 
    <!-- --> 
    <sec:csrf token-repository-ref="csrfTokenRepository" /> 
</sec:http> 

<!-- rewrite headerName --> 
<bean id="csrfTokenRepository" class="org.springframework.security.web.csrf.HttpSessionCsrfTokenRepository"> 
    <property name="headerName" value="X-SECURITY" /> 
</bean> 

2 단계 - 프리 마커 템플릿 :

<form accept-charset="UTF-8" action="/portal" method="POST" name="formAddItemToCart"> 
    <!-- ... --> 

    <!-- inlcude csrf token --> 
    <input type="hidden" 
      name="${_csrf.parameterName}" 
      value="${_csrf.token}"/> 
</form> 

3 단계 - 렌더링 된 출력 :

<form accept-charset="UTF-8" action="/portal" method="POST" name="formAddItemToCart"> 
    <!-- ... --> 

    <input type="hidden" name="" value=""/> 
</form> 

4 단계 - 프리 마커 템플릿 오류 :

FreeMarker template error: 
The following has evaluated to null or missing: 
==> _csrf [in template "cart.ftl" at line 28, column 21] 

참조 : http://docs.spring.io/spring-security/site/docs/3.2.0.RELEASE/reference/htmlsingle/#csrf

는 현재 내가 전체 응용 프로그램을 디버깅하고있다.

정확히 어디서 문제가 있는지 알 수는 없지만 csrf가 freemarker와 작동하지 않는 것 같습니다. 일반적으로 freemarker 템플릿에 csrf 토큰을 포함시킬 수 있습니까? 제안이나 해결책이 있습니까?

+0

모델에 추가됩니다 (HttpServletRequest 속성으로 설정되어 있으므로 기본적으로이 작업을 수행해야합니다). Freemarker를 Spring MVC (즉, FreeMarkerViewResolver)와 함께 사용하고 있습니까? 블록을 보안을 사용하지 않도록 설정 했습니까 (예 : security = none)? 그렇다면 CSRF 토큰이 해당 요청에 채워지지 않으므로 permitAll을 사용해야합니다. –

+0

Im Freemarker를 Spring MVC와 함께 사용하고 있으며 이미 permitAll에 대한 액세스 속성을 구성했습니다. 그러나 CSRF 토큰은 이러한 요청에 채워지지 않습니다. – m3tr4s

+0

작동 중 - 질문에서 업데이트 ... – m3tr4s

답변

0

UPDATE :

XML 구성이 제대로 이루어지지했다. 많은 도움이되는 해결책을 찾았습니다. https://github.com/spring-projects/spring-mvc-showcase/commit/361adc124c05a8187b84f25e8a57550bb7d9f8e4

지금 내 파일을 다음과 같이 :

security.xml

<sec:http> 
     <!-- ... --> 
     <sec:csrf /> 
</sec:http> 

<bean id="requestDataValueProcessor" class="org.springframework.security.web.servlet.support.csrf.CsrfRequestDataValueProcessor"/> 

<bean id="csrfFilter" class="org.springframework.security.web.csrf.CsrfFilter"> 
    <constructor-arg> 
     <bean class="org.springframework.security.web.csrf.HttpSessionCsrfTokenRepository"> 
      <property name="headerName" value="X-SECURITY" /> 
     </bean> 
    </constructor-arg> 
</bean> 

web.xml을

봄 보안의 CSRF가 CSRF 토큰으로 너무 오래 프리 마커와 함께 잘 작동합니다
<filter> 
    <filter-name>csrfFilter</filter-name> 
    <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class> 
    <async-supported>true</async-supported> 
</filter> 

<filter-mapping> 
    <filter-name>csrfFilter</filter-name> 
    <url-pattern>/*</url-pattern> 
</filter-mapping> 
관련 문제