Spring cloud gateway 使用总结
Spring cloud gateway 使用总结
一、跨域配置
由于前端通过网关调用,一般是跨域的请求。所以可以在Spring Cloud Gateway直接配置跨域配置,而下游服务就不同配置跨域了。
可以在application.yml
这样配置,这是比较细粒度的配置(这是Spring 官方文档提供的配置:https://cloud.spring.io/spring-cloud-static/spring-cloud-gateway/2.1.0.RELEASE/multi/multi__cors_configuration.html):
spring:
cloud:
gateway:
globalcors:
corsConfigurations:
'[/**]':
allowedOrigins: "http://docs.spring.io"
allowedMethods:
- GET
为了方便你可以粗略地配置,让所有请求都做跨域处理:
spring:
cloud:
gateway:
# 跨域
globalcors:
corsConfigurations:
'[/**]':
allowCredentials: true
allowedOrigins: "*"
allowedMethods: "*"
allowedHeaders: "*"
Spring cloud gateway 结合 Oauth2 Resource Server 认证失败跨域配置失效问题
问题描述:使用自定义AuthorizationManager
进行权限检查时,如果用户没有权限则授权失败。但是前端请求显示为跨域错误。
原因:我猜可能是AuthorizationManager
认证失败后,之后请求的处理没走到之前配置跨域配置的过滤器,导致跨域失败。
解决方案:我们知道浏览器对访问跨域资源先发送一个OPTION
请求,看是否能否跨域访问,如果允许跨域就继续请求。(参考文章[浏览器何时发送一个Option请求)。因此我们对于自定义AuthorizationManager
授权逻辑应该对OPTION
请求无条件通过,以便浏览器进一步请求。
这仅仅第一步,如果非OPTION
请求但是授权失败了,我们还会遇到跨域错误。因此在授权失败时候我们要手动进行跨域处理。
定义我们自己的ServerAuthenticationEntryPoint
这个主要是Oauth2授权处理。
这里主要关注processCorsHeaders
这个方法。这里添加HTTP
请求头的Access-Control-Allow-Origin
,如果其他需求也可以自己添加。