Spring Security CORS问题:“OPTIONS http:// localhost:8080/403()”

时间:2018-03-15 14:56:51

标签: java spring spring-security cors angular-cli

我一直致力于在我的后端使用spring + spring安全性的项目,并且最近特别遇到了cors的问题:

The first two lines you can see successful api call output, following that chrome attempts to send http request with an options header to my rest service.

前两行你可以看到成功的api通话输出,然后Chrome会尝试向我的休息服务发送带有选项标题的Http请求。

我的问题可能是这个问题的根源?

我在Dev中的前端使用角度CLI客户端,我没有遇到任何CORS问题,直到我为spring安全性创建了一个自定义过滤器,因此添加了我的WebConfigurerAdapter配置。如果需要,很高兴提供额外的代码。但是我并不认为它与之相关,因为我已经删除了过滤器并且出现了同样的问题。

在chrome,firefox和ubuntu浏览器中测试过相同的问题。

Angular CLI成功代理对'/ api / [blah]'的调用 Angular CLI is Proxying my rest service

这是我的代理配置,我尝试过匹配所有内容,但这没有任何区别。

{
"/api/*": {
  "target": "http://localhost:8080",
  "secure": false,
  "logLevel": "debug",
  "changeOrigin": true
}

}

WebSecurityAdapter配置

@Override
protected void configure(HttpSecurity http) throws Exception {

    http
            .httpBasic()
            .and()
            .authorizeRequests()
            .antMatchers("/index.html",  "/api/registration", "/api/authenticate",
                    "/api/isAuthenticated", "/api/validateCaptcha", "/console", "/api/loginRecaptchaRequired", "/api/login", "/")
            .permitAll()
            .anyRequest()
            .authenticated()
            .and()
            .addFilterBefore(
                    authenticationFilter(),
                    UsernamePasswordAuthenticationFilter.class)
            .logout()
            .logoutUrl("/api/logout")
            .and()
            .csrf()
            .csrfTokenRepository(CookieCsrfTokenRepository.withHttpOnlyFalse())
            .and()
            .addFilterAfter(csrfHeaderFilter(), SessionManagementFilter.class);

}

请求标头: enter image description here

1 个答案:

答案 0 :(得分:3)

为什么你的代码不能正常工作

您缺少Access-Control-Allow-Origin标头,因此不允许任何网站向您的网站发出CORS请求

修复

你可以:

  • 从同一来源提出请求
  • 使用spring security将标题添加到回复
  • 手动添加标题

允许的起源

标题可以是允许的原始白名单,也可以*允许任何来源发送请求。

这是否会阻止除白名单之外的所有请求

这仅在浏览器中受到保护,恶意软件仍然可以向任何端点发出请求,而不必遵守CORS。