Spring Security 3.2,CSRF和多部分请求

时间:2014-08-07 14:49:51

标签: java spring spring-security

此问题与此网址上的问题有关 Spring Security 3.2 CSRF support for multipart requests

我尝试了这个完全相同的设置以及要点,但除非我在网址中有_csrf令牌,否则我无法使用它。我在表单主体中将它作为隐藏字段并在安全过滤器之前指定了过滤器,但没有任何欢乐,并且每次都使用无效csrf令牌的调试日志消息失败

非常感谢对此的任何帮助

干杯达米恩

1 个答案:

答案 0 :(得分:7)

没有要点就很难找到,但我终于明白了!

实际上它与Spring安全无关。真正的问题只出在SpringFramework多部分配置中。但由于这个原因,请求似乎根本没有参数(_csrffile),而第一个检测它的是CsrfFilter。我删除了有关安全性的所有内容,错误是Requested parameter file absent(或类似的内容......)

详见Spring Framework manual,可以通过两种方式处理多部分:

  • 使用Apache commons fileupload
  • 使用servlet 3.0配置

    1. 您已关注相关帖子的第一个解决方案,并在CommonsMultipartResolver中配置了mvc-dispatcher-servlet.xml。第一个问题是MultipartFilter与全局ServletContext相关,并在根应用程序上下文中查找其MultipartResolver,而不是在servlet特定的上下文中。
    2. 第二个问题是你忘记在pom.xml中添加对Apache commons fileupload的依赖。

      因此,您必须先在pom.xml

      中添加此依赖项
      <dependency>
          <groupId>commons-fileupload</groupId>
          <artifactId>commons-fileupload</artifactId>
          <version>1.3.1</version>
      </dependency>
      

      接下来,您必须从filterMultipartResolver中删除mvc-dispatcher-servlet.xml bean并在根应用程序上下文中声明它。作为快速而肮脏的修复,您可以将其添加到spring-security.xml

      <beans:bean id="filterMultipartResolver"
            class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
          <beans:property name="maxUploadSize" value="100000000" />
      </beans:bean>
      
      1. 另一种配置是使用servlet 3.0的多部分处理。 无需依赖apache commons fileupload,也不需要将任何bean添加到配置中,因为MultipartFilter使用StandardServletMultipartResolver作为默认值。
      2. 您只需在<multipart-config>

        中的DispatcherServlet声明中添加web.xml元素
        <servlet>
            <servlet-name>dispatcher</servlet-name>
            <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
            <multipart-config>
                <!--location>/tmp</location-->
                <max-file-size>1000000</max-file-size>
            </multipart-config>
        </servlet>