2014-02-13 8 views
4

После повышения до Spring Security 3.2.0 и настройки xml токен _csrf не работает.spring security 3.2.0 Значок csrf не работает в шаблоне freemarker

Основы:

  • Spring 4.0.1
  • Spring Security 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. Можно ли вообще включить токен csrf в шаблон freemarker? У вас есть предложения или решения?

+0

CSRF Spring Security должно работать нормально с Freemarker так долго, как лексемы CSRF добавляется в модель (это должно быть сделано по умолчанию, поскольку оно установлено как атрибут HttpServletRequest). Используете ли вы Freemarker с Spring MVC (т. Е. FreeMarkerViewResolver)? Вы сконфигурировали блоки для отключения безопасности (т. Е. Security = none)? Если это так, это означает, что токен CSRF не заполняется этими запросами, и вы должны использовать allowAll. –

+0

Я использую Freemarker с Spring MVC и уже настроил атрибут доступа allowAll. Но токен 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> 
Смежные вопросы