当前位置: 首页 > 知识库问答 >
问题:

spring security 3.2.0 csrf令牌在freemarker模板中不工作

任繁
2023-03-14

升级到Spring Security 3.2.0并配置xml后,_csrf令牌不起作用。

基本原理:

  • Spring4.0.1
  • Spring Security 3.2.0。
  • Freemarker模板语言

第1步-Spring Security 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令牌吗?你有什么建议或解决方案吗?

共有1个答案

何兴邦
2023-03-14

更新:

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>
 类似资料:
  • 当我点击登录按钮并通过数据库成功登录后,它被重定向到hello.ftl页面。但是ftl页面显示此错误 FreeMarker模板错误(调试模式;在生产中使用RETHROW!):以下内容的计算结果为null或missing:==>var[在模板“hello.ftl”第8行,第32列]----提示:如果已知失败的表达式在法律上引用了有时为null或missing的内容,可以指定默认值,如myoption

  • 在我的应用程序中,所有freemarker模板都位于/templates/ftl/中,因此在应用程序部署期间,我加载了一个类,我调用了一个扩展FreemarkerManager并具有方法的类 这样,当我需要加载模板文件时,我可以这样做: 仅在一种特定情况下,我需要获得一个来自完全不同路径的模板(而不是/templates/ftl/)。 如何在这个特定的时刻声明模板加载的第二个目录,而不破坏所有调用

  • 我正在尝试使用从多个位置加载模板。这个项目是使用开发的。 我有两个maven项目: > 我的网站:maven的主要项目,包含自定义模板,例如WEB-INF/ftl/landing/login。ftl 通用模板:包含位于WEB-INF/ftl的通用freemarker模板,例如WEB-INF/ftl/landing/login。ftl 例如,Freemarker的想法是在“我的网站”中搜索登陆/登录

  • 我对使用Dropwizard和Freemarker模板非常陌生。我正在尝试加载免费标记模板。但是,图像不会加载到正在显示的页面中 我使用html的标准img标记来显示图像 这些图像在jar文件中可用。 以下是该项目的结构 src |-main |--resources |--media |--images |--mload。巴布亚新几内亚 请让我知道如果我错过了任何显示图像

  • 我在Dropwizard应用程序中设置视图时遇到了Freemarker的一个奇怪问题。 按照这里的文档,我建立了一个非常简单的示例,如下所示 使用 呈现时的预期输出是显示的HTML文档。 实际发生的情况是Freemarker抛出一个异常,抱怨——特别是——未定义。 这似乎是因为是一个公共字段,没有getter。当我添加一个公共字符串getBar(){返回栏;}getter到时,它就工作了。 我有点