【问题标题】:How to make MultipartFilter to work with Spring Boot如何使 MultipartFilter 与 Spring Boot 一起使用
【发布时间】:2018-03-26 08:05:30
【问题描述】:

作为参考,我们有两个选项可以让 Multipart 与 Spring Security 一起使用:

  • 在 Spring Security 之前放置 MultipartFilter
  • 在行动中包含 CSRF 令牌

对于第一个选项,我尝试了以下方法:

  • 创建 SecurityApplicationInitializer 类:
public class SecurityApplicationInitializer extends AbstractSecurityWebApplicationInitializer {
    @Override
    protected void beforeSpringSecurityFilterChain(ServletContext servletContext) {
        insertFilters(servletContext, new MultipartFilter());
    }
}
  • 在 application.properties spring.security.filter.order=5987654322@中更改 spring 安全过滤器顺序

  • 然后添加FilterRegistrationBean

@Bean
@Order(0)
    public FilterRegistrationBean registerMultipartFilter() {
    FilterRegistrationBean reg = new FilterRegistrationBean<>(new MultipartFilter());
    reg.setOrder(1);
    return reg;
}

不幸的是,它们都不起作用,我尝试禁用 csrf 保护,它按预期工作,那么我的配置有什么问题?

【问题讨论】:

  • 我一个一个地试了一遍,然后全部都试了一遍。我也尝试删除 @EnableWebSecurity 但它仍然不起作用
  • 对于第二个选项(将 CSRF 令牌添加到表单中),它可以正常工作
  • 是的,使用第二个选项,但我真的很想知道为什么第一个选项不起作用
  • 谢谢兄弟,抱歉问题过于复杂,原来我需要在表单中添加th:action

标签: java spring-mvc spring-boot spring-security multipart


【解决方案1】:

事实证明 Spring Boot 已经为我们做了很多事情。问题根本不是 MultipartFilter。在使用 Spring Boot 时,我们甚至不需要为 CSRF 保护设置 MultipartFilter。

真正的问题是我的 Thymeleaf 表单:

<form method="POST" enctype="multipart/form-data">
            <input type="file" name="file"/>
            <input type="submit" value="Upload"/>

没有th:action,spring boot 不会自动为我们插入隐藏的 csrf 令牌。

<form th:action="''" method="POST" enctype="multipart/form-data">
            <input type="file" name="file"/>
            <input type="submit" value="Upload"/>
</form>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-12-29
    • 2020-11-02
    • 2021-01-02
    • 2020-03-09
    • 2015-05-15
    • 2022-01-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多