Java 春季安全CORS发行版:“;选择权http://localhost:8080/ 403()”;

Java 春季安全CORS发行版:“;选择权http://localhost:8080/ 403()”;,java,spring,spring-security,cors,angular-cli,Java,Spring,Spring Security,Cors,Angular Cli,我一直在从事一个在后端使用spring+spring安全性的项目,最近遇到了cors的一个问题: 您可以看到的前两行成功的api调用输出,随后chrome尝试向my rest服务发送带有选项头的Http请求 我的问题是什么可能是这个问题的根源? 我在dev中的前端使用angular CLI客户端,在我为spring security创建自定义过滤器之前,我没有遇到任何CORS问题,因此添加了我的WebConfigureAdapterconfig。如果需要,乐意提供附加代码。然而,我认为这与

我一直在从事一个在后端使用spring+spring安全性的项目,最近遇到了cors的一个问题:

您可以看到的前两行成功的api调用输出,随后chrome尝试向my rest服务发送带有选项头的Http请求


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


我在dev中的前端使用angular CLI客户端,在我为spring security创建自定义过滤器之前,我没有遇到任何CORS问题,因此添加了我的
WebConfigureAdapter
config。如果需要,乐意提供附加代码。然而,我认为这与此无关,因为我已经移除了过滤器,同样的问题也发生了

在chrome、firefox和ubuntu浏览器中测试时,也会出现同样的问题

Angular CLI正在成功代理对“/api/[blah]”的调用。

这是我的代理配置,我尝试了所有的匹配,但这没有什么区别

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

WebSecurityAdapter
Config

@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);

}
请求标头:

为什么您的代码不起作用 您缺少
Access Control Allow Origin
标题,因此不允许任何站点向您的站点发出CORS请求

修复 您可以:

  • 从同一来源发出请求
  • 使用spring security将标题添加到响应中
  • 手动添加标题
允许什么起源 标题可以是要允许的来源的白名单,也可以是
*
,以允许任何来源发送请求

这会停止除白名单以外的所有请求吗
这仅在浏览器中提供保护,恶意软件仍然可以向任何端点发出请求,而无需遵守CORS。

您似乎缺少allow origin标头,因此任何源站都不能使用CORS。后端,我会计算出哪些域应该能够发出CORS请求,并在此处列出它们,除非您想公开,然后使用
*
谢谢,使用此添加CORS:谢谢:)我觉得奇怪的一件事是,我已经使用相同的设置一段时间了,但没有添加CORS,理想情况下,我希望设置它,这样我就不必允许cors,这样就不会意外地将cors添加到prod中。此外,允许localhost:4200,攻击者就不能代理自己显示为该站点吗?这更能防止Cookie与请求一起发送,因为攻击者无法以登录用户的身份向API发出请求,即使他们代理访问API。