传递授权标头时的Spring Security CORS问题[重复]

Posted

技术标签:

【中文标题】传递授权标头时的Spring Security CORS问题[重复]【英文标题】:Spring Security CORS issue when passing Authorization header [duplicate] 【发布时间】:2020-06-02 03:42:56 【问题描述】:

我浪费了很多时间来解决这个问题,但现有的解决方案都不适用于我的情况。 让我解释一下我的服务器设置。 我有 2 个 docker 容器,一个用于 Angular 应用程序(nginx - url - http://localhost:8080)和 Spring Boot 应用程序(tomcat - url - http://localhost:8081)。 此应用正在使用 Oauth2 jdbcToken 身份验证进行 API 请求。

这个应用是一个简单的用户注册应用。

我可以注册一个新用户,因为注册 url 不安全并且没有传递任何授权标头。 但是一旦用户登录 CORS 问题就会出现。下面我列出了错误。

从源“http://localhost:8080”访问“http://localhost:8081/v1/api/group/find/shib”处的 XMLHttpRequest 已被 CORS 策略阻止:对预检请求的响应未通过访问控制检查:它没有 HTTP ok 状态。

让我告诉你我做了什么来解决这个问题。 在 Angular HTTP 请求中,我添加了以下标头。

'Authorization' : 'Bearer '+this.token(),
'Access-Control-Allow-Methods' : '*',
'Access-Control-Allow-Origin' : "*",
'Access-Control-Allow-Headers' : 'Content-Type, Accept, X-Requested-With, remember-me, Authorization',
"Access-Control-Expose-Headers" : "Content-Type, Accept, X-Requested-With, remember-me, Authorization"

在 Spring Boot 中,我在带有 CORSFilter 的 Rest 控制器上添加了 @CrossOrigin / @CrossOrigin("http:localhost:8080")

@Override
public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException 


    HttpServletRequest request = (HttpServletRequest) req;
    HttpServletResponse response = (HttpServletResponse) res;

    response.setHeader("Access-Control-Allow-Origin", "*");
    response.setHeader("Access-Control-Allow-Credentials", "true");
    response.setHeader("Access-Control-Allow-Methods", "POST, GET, OPTIONS, DELETE");
    response.setHeader("Access-Control-Max-Age", "3600");
    response.setHeader("Access-Control-Allow-Headers", "Content-Type, Accept, X-Requested-With, remember-me, Authorization");
    chain.doFilter(req, res);

经过所有的试验和错误,我仍然得到同样的错误

【问题讨论】:

响应的 HTTP 状态码是什么?您可以使用浏览器开发工具中的网络窗格进行检查。 headers: HttpHeaders normalizedNames: Map(0), lazyUpdate: null, headers: Map(0) status: 0 statusText: "Unknown Error" url: "localhost:8081/v1/api/group/find/shib" ok: false name :“HttpErrorResponse”消息:“localhost:8081/v1/api/group/find/shib 的 Http 失败响应:0 未知错误”错误:ProgressEvent isTrusted: true, lengthComputable: false, loaded: 0, total: 0, type: "error", ... proto: HttpResponseBase @sideshowbarker 没有出现 HTTP 状态代码 在***.com/a/42021652/441757和***.com/a/43559441/441757和***.com/a/42208796/441757查看答案 运气不好。我试过了 【参考方案1】:

我阅读并了解了更多关于预检请求及其工作方式的内容。 我的一个快速想法是让 OPTIONS 请求通过,所以我将以下代码添加到我的 WebSecurityConfigurerAdapter。

@Override
protected void configure(HttpSecurity http) throws Exception 
    http
    .csrf().disable()
    .authorizeRequests()
    .antMatchers(HttpMethod.OPTIONS,"*").permitAll()//allow CORS option calls
    .antMatchers("/oauth/token").permitAll()
    .anyRequest().authenticated()
    .and()
    .formLogin()
    .and()
    .httpBasic();

除了授权之外,Angular ui 没有额外的标头。

我希望这对每个人都有效。我现在知道 OPTIONS 很容易受到攻击,但这只是一个快速的解决方法。 如果您有更好、更安全的解决方案,请建议我。

【讨论】:

当一个AUTHORIZATION头被添加到一个请求中时,浏览器会自动做一个pre-flight OPTIONS请求。服务器必须使用正确的 CORS 标头进行响应。否则浏览器将阻止访问响应。来自 OPTIONS 请求的 OK 状态响应是强制性的。

以上是关于传递授权标头时的Spring Security CORS问题[重复]的主要内容,如果未能解决你的问题,请参考以下文章

使用 Spring Security 自定义 Http 授权标头

针对授权标头的Spring Security OAuth2 CORS问题

授权标头的 Spring Security OAuth2 CORS 问题

使用 AngularJS 登录后不存在授权标头时,Spring Security 不会抛出错误

如何使用带有 WebClient 的 spring-security-oauth2 自定义 OAuth2 令牌请求的授权标头?

Spring Security JWT - 通过授权标头的邮递员身份验证有效,但从我的 Angular 前端不起作用