【问题标题】:Spring Security CORS Issue: "OPTIONS http://localhost:8080/ 403 ()" [duplicate]Spring Security CORS 问题:“选项 http://localhost:8080/403 ()”[重复]
【发布时间】:2018-08-24 10:59:06
【问题描述】:

我一直在做一个在我的后端使用 spring + spring security 的项目,最近遇到了一个与 cors 相关的问题:

前两行您可以看到成功的 api 调用输出,随后 chrome 尝试将带有选项标头的 Http 请求发送到我的休息服务。


我的问题是这个问题的潜在根源是什么?


我在 dev 中的前端使用 angular CLI 客户端,在我为 Spring Security 创建自定义过滤器并添加我的 WebConfigurerAdapter 配置之前,我没有遇到任何 CORS 问题。如果需要,很乐意提供额外的代码。但是我认为它与此无关,因为我删除了过滤器并且发生了同样的问题。

在 chrome、firefox 和 ubuntu 浏览器中测试出现同样的问题。

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

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

{
"/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);

}

请求标头:

【问题讨论】:

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


【解决方案1】:

为什么您的代码不起作用

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

修复

您可以:

  • 从同一来源发出请求
  • 使用 spring security 将标头添加到响应中
  • 手动添加标题

允许的来源

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

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

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

【讨论】:

  • 谢谢 :) 我觉得奇怪的一件事是我已经使用相同的设置有一段时间了,但不必添加 cors,理想情况下我喜欢设置它以便我不必允许 cors,这样就不会意外地将 cors 添加到 prod 中。另外,如果允许 localhost:4200,攻击者就不能代理自己以显示为该站点吗?
  • 更多的是防止 cookie 与请求一起发送,因为攻击者无法以登录用户的身份向 API 发出请求,即使他们代理了对 API 的访问。跨度>
猜你喜欢
  • 2018-01-07
  • 2016-10-30
  • 1970-01-01
  • 2021-01-20
  • 2021-10-05
  • 2019-05-27
  • 2021-07-03
  • 2020-01-25
相关资源
最近更新 更多