【问题标题】:File upload & Spring Security文件上传 & Spring Security
【发布时间】:2015-03-29 07:22:19
【问题描述】:

基于Spring Security documentation,我设置了一个MultipartFileter,如下:

@Order(1)
public class SecurityWebAppInitializer
   extends AbstractSecurityWebApplicationInitializer {

     @Override
        protected void beforeSpringSecurityFilterChain(ServletContext servletContext) {
            insertFilters(servletContext, new MultipartFilter());
        }

在文件上传表单中,我可以在 HTML 文件中看到带有非空值的 CSRF 输入(参见下面的代码)。

<form method="POST" enctype="multipart/form-data" action="/upload">
    File to upload: <input type="file" name="file" /><br /> 
    Name: <input type="text" name="name" /><br /> <br /> 
    <input type="submit" value="Upload" /> 
    Press here to upload the file!
<input type="hidden" name="_csrf" value="df94be7d-675d-428c-89e5-2ebf0b473c42" />
</form>

提交表单后,我收到一个错误

HTTP 状态 403 - 在请求参数“_csrf”或标头“X-CSRF-TOKEN”上发现无效的 CSRF 令牌“null”。

输入状态报告

在请求参数“_csrf”或标头“X-CSRF-TOKEN”上发现消息无效的 CSRF 令牌“null”。

说明对指定资源的访问已被禁止。

这里缺少什么?

【问题讨论】:

  • 你有MultipartResolver吗?
  • 是的,我愿意。为了验证它是否有任何区别,我将 MutipartResover 注释掉,我得到了同样的原因。我看不到解析器定义与空 CSRF 令牌的关系。所以,请赐教。
  • 如果没有正确配置多部分解析器,Spring Security 无法在 multipart/form-data 中找到 CSRF 令牌。你的MultipartResolver bean 定义?
  • 感谢您的提示。问题已解决。有关详细信息,请参阅我对我自己的问题的回答。您可能知道哪些更改会产生影响。

标签: spring-security


【解决方案1】:

更改应用程序的 Java 配置后,此问题得到解决。以下是这些变化。

在 AbstractAnnotationConfigDispatcherServletInitializer 类中,我在 getServletFilters 方法中添加 MultipartFilter,并在 customizeRegistration(ServletRegistration.Dynamic registration) 方法中使用 MultipartConfigElement 设置 MultipartConfig。删除了最初在 WebMvcConfigurerAdapter 类中定义的 MutlipartConfigElement。并且类中定义的 MultipartResolver 保持不变。

Java 配置是根据应用程序的原始 XML 配置设置的。基于这种情况,该方法并不总是有效。

【讨论】:

    猜你喜欢
    • 2014-10-31
    • 1970-01-01
    • 2016-09-07
    • 2015-11-09
    • 2014-10-26
    • 1970-01-01
    • 2014-07-17
    • 2017-11-05
    • 2015-10-16
    相关资源
    最近更新 更多