作为引用,我们有两个选项可以使 Multipart 与 Spring Security 配合使用:
- 将 MultipartFilter 置于 Spring Security 之前
- 在操作中包含 CSRF token
对于第一个选项,我尝试了以下方法:
- 创建 SecurityApplicationInitializer 类:
public class SecurityApplicationInitializer extends AbstractSecurityWebApplicationInitializer { @Override protected void beforeSpringSecurityFilterChain(ServletContext servletContext) { insertFilters(servletContext, new MultipartFilter()); } }
更改 application.properties 中的 spring security 过滤器顺序
spring.security.filter.order=5
然后添加FilterRegistrationBean
@Bean @Order(0) public FilterRegistrationBean registerMultipartFilter() { FilterRegistrationBean reg = new FilterRegistrationBean<>(new MultipartFilter()); reg.setOrder(1); return reg; }
不幸的是,它们都不起作用,我尝试禁用 csrf 保护,它按预期工作,那么我的配置出了什么问题?
最佳答案
事实证明 Spring Boot 已经为我们做了很多事情。问题根本不在于 MultipartFilter。使用 Spring Boot 时,我们甚至不需要设置 MultipartFilter 来进行 CSRF 保护。
真正的问题是我的 Thymeleaf 表单:
<form method="POST" enctype="multipart/form-data">
<input type="file" name="file"/>
<input type="submit" value="Upload"/>
如果没有th:action
,Spring Boot将不会自动为我们插入隐藏的csrf token 。
<form th:action="''" method="POST" enctype="multipart/form-data">
<input type="file" name="file"/>
<input type="submit" value="Upload"/>
</form>
关于java - 如何使 MultipartFilter 与 Spring Boot 一起使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49486675/