上传Spring Security拒绝的文件

时间:2014-09-06 05:20:09

标签: spring spring-security thymeleaf

我最近在我的spring mvc应用程序中实现了一个文件上传功能,但遗憾的是它无法正常工作,因为它经常被Spring Security阻止。如果我在安全配置中禁用CSRF它可以工作,所以它让我相信那里出了问题。

Spring config:

@Override
protected void configure(HttpSecurity http) throws Exception {
    http
            .authorizeRequests()
                .antMatchers("/test/**").permitAll()
                .antMatchers("/admin/**","/user/secure").hasRole("ADMIN")
                .antMatchers("/**").permitAll()
                .anyRequest().anonymous()
            .and()
            .exceptionHandling().accessDeniedPage("/denied")
            .and()
            .formLogin()
                .loginPage("/login")
                .failureUrl("/error-login")
                .permitAll()
            .and()
            .logout()
                .logoutRequestMatcher(new AntPathRequestMatcher("/logout"))
                .logoutSuccessUrl("/")
            .and()
            .rememberMe()
                .userDetailsService(userAccessDetails)
                .tokenRepository(persistentTokenRepository())
                .tokenValiditySeconds(16000)
    ;
} 

文件上传表单:

<html xmlns:th="http://www.thymeleaf.org" lang="en">
<head>
    <meta charset="UTF-8"/>
    <title></title>
</head>
<body>
    <h4>Single File</h4>
    <form method="POST" th:action="@{/test/uploadFile}" enctype="multipart/form-data">
        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!
    </form>
</body>
</html>

任何帮助都会受到赞赏。

注意:我必须重新创建问题,因为我错误地删除了

1 个答案:

答案 0 :(得分:1)

你可以做三件事。

1)在Spring CSRF文档中提到实现Multipart过滤器(有关更多详细信息,请参见下面的链接) - http://docs.spring.io/spring-security/site/docs/3.2.0.CI-SNAPSHOT/reference/html/csrf.html#csrf-multipartfilter

以及多部分解析器bean http://docs.spring.io/spring/docs/3.2.x/spring-framework-reference/html/mvc.html#mvc-multipart

---除非在上传过程中涉及更多自定义代码,否则这应该可行。如果它有一些自定义,那么选项2更好

2)在config中实现SpringSecurityFilterchain。在安全过滤器开始执行之前添加Multipart过滤器。实现多部分解析器。

3)没有任何作用然后尝试在客户端转换Json中的文件并将其作为二进制数据发布到服务器。 (它是一种解决方法,并试图避免因为它不是一个好的设计)。 - 例如pdf2json你可以使用这个js文件

如果有任何选项有帮助,请告诉我。