【发布时间】:2016-05-20 19:09:27
【问题描述】:
更新: 现在回顾一年多后,我给出了一个更新希望能帮助别人。
Spring IO 建议对普通用户可以通过浏览器处理的任何请求使用 CSRF 保护。如果您只创建非浏览器客户端使用的服务,您可能希望禁用 CSRF 保护。 由于我的应用是一个 API,会被浏览器处理,所以禁用 CSRF 不是一种方法。
默认情况下,CSRF 在 Spring Boot 中启用,您需要添加以下代码以添加 CSRF 存储库和过滤器以将 CSRF 令牌添加到您的 http 请求。 (解决方法来自这里Invalid CSRF Token in POST request)
@Override
protected void configure(HttpSecurity http) throws Exception {
http
.authorizeRequests()
.antMatchers("/assets/**", "/templates/**", "/custom-fonts/**", "/api/profile/**", "/h2/**").permitAll()
.anyRequest().authenticated()
.and()
.formLogin()
.loginPage("/login")
.permitAll()
.and()
.logout()
.logoutSuccessUrl("/login?logout")
.permitAll()
.and()
.csrf().csrfTokenRepository(csrfTokenRepository())
.and()
.addFilterAfter(csrfHeaderFilter(), SessionManagementFilter.class); // Register csrf filter.
}
filter & CsrfToken Repository 部分:
private Filter csrfHeaderFilter() {
return new OncePerRequestFilter() {
@Override
protected void doFilterInternal(HttpServletRequest request,
HttpServletResponse response,
FilterChain filterChain) throws ServletException, IOException {
CsrfToken csrf = (CsrfToken) request.getAttribute(CsrfToken.class.getName());
if (csrf != null) {
Cookie cookie = WebUtils.getCookie(request, "XSRF-TOKEN");
String token = csrf.getToken();
if (cookie == null || token != null
&& !token.equals(cookie.getValue())) {
// Token is being added to the XSRF-TOKEN cookie.
cookie = new Cookie("XSRF-TOKEN", token);
cookie.setPath("/");
response.addCookie(cookie);
}
}
filterChain.doFilter(request, response);
}
};
}
private CsrfTokenRepository csrfTokenRepository() {
HttpSessionCsrfTokenRepository repository = new HttpSessionCsrfTokenRepository();
repository.setHeaderName("X-XSRF-TOKEN");
return repository;
}
我在 2016 年 2 月提出的原始问题
我致力于为 Spring 4 的 Spring-boot RESTful API 提供全球 CORS 支持。
我正在关注官方 Spring Boot Doc(https://spring.io/guides/gs/rest-service-cors/) 并将其添加到我的应用程序中:
public class SomeApiApplication {
public static void main(String[] args) {
SpringApplication.run(SomeApiApplication.class, args);
}
//Enable Global CORS support for the application
@Bean
public WebMvcConfigurer corsConfigurer() {
return new WebMvcConfigurerAdapter() {
@Override
public void addCorsMappings(CorsRegistry registry) {
registry.addMapping("/**")
.allowedOrigins("http://localhost:8080")
.allowedMethods("GET", "POST", "PUT", "DELETE", "HEAD")
.allowedHeaders("header1", "header2") //What is this for?
.allowCredentials(true);
}
};
}
}
我不明白为什么只有 GET 有效,对于其余的 http 调用,我收到一条错误消息,提示“无效的 CORS 请求”。我错过了设置中的任何内容吗?如果我的设置不正确,GET 也不应该工作。我很困惑。
【问题讨论】:
-
尝试发布 XML 配置
-
我正在使用 POSTMAN 进行测试。对于我的请求标头,我有授权和内容类型。我想知道我是否需要为 CORS 放一些额外的标题?
-
@Abdelhak:我使用的是 Spring 4,我的代码中不应包含任何 XML。
-
我必须手动指定所有方法都被允许(包括删除和补丁之前未能通过 CORS 协商) - 省略 .allowedMethods 调用不会自动添加所有方法!
标签: java spring spring-mvc cors