2014-02-13 97 views
4

在升級到Spring Security 3.2.0並配置xml之後,_csrf令牌不起作用。spring security 3.2.0 csrf令牌在freemarker模板中不起作用

基本面:

  • 春4.0.1
  • 春季安全3.2.0。
  • Freemarker模板語言

步驟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 - 在的freemarker模板:

<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模板錯誤:

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

Spring Security的CSRF能很好地工作的Freemarker只要CSRF令牌被添加到模型中(這應該默認完成,因爲它被設置爲HttpServletRequest屬性)。您是否使用Spring MVC的Freemarker(即FreeMarkerViewResolver)?您是否配置了任何塊來禁用安全性(即安全性=無)?如果是這樣,這意味着CSRF令牌不會填充這些請求,您應該使用permitAll。 –

+0

我在Spring MVC中使用了Freemarker,並且已經將access屬性配置爲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

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