介绍
:::tips 授权规则可以对请求方来源做判断和控制,有白名单和黑名单两种方式
- 白名单:来源(origin)在白名单内的调用者允许访问
- 黑名单:来源(origin)在黑名单内的调用者不允许访问
点击左侧菜单的授权,可以看到授权规则
- 资源名:就是受保护的资源
- 流控应用:就是来源者的名单
- 如果是勾选白名单,则名单中的来源被许可访问,其他来源禁止访问
- 如果是勾选黑名单,则名单中的来源被禁止访问,其他来源允许访问
如果需要允许请求从gateway到服务,不允许浏览器访问服务,那么白名单中就要填写网关的来源名称(origin) :::
获取请求来源(origin)
:::tips Sentinel是通过RequestOriginParser这个接口的parseOrigin方法来获取请求来源的,这个方法的作用就是从请求对象中获取请求者的origin值并返回。默认情况下,Sentinel不管请求者从哪里来,返回值永远是default,也就是说一切请求的来源都被认为是一样的值(default),因此需要自定义这个接口的实现类,让不同的请求返回不同的origin :::
//实现RequestOriginParser接口,让不同的请求返回不同的origin
@Component
public class HeaderOriginParser implements RequestOriginParser {
@Override
public String parseOrigin(HttpServletRequest httpServletRequest) {
//从请求头中获取orign
String origin = httpServletRequest.getHeader("origin");
//非空判断
if(StringUtils.isEmpty(origin)){
origin = "blank";
}
return origin;
}
}
添加请求头
:::tips 既然是从请求头中获取origin值,就必须让所有从gateway路由到微服务的请求都带上origin请求头,可以通过GatewayFilter来实现统一添加请求头
修改gateway网关工程的配置文件,添加一个defaultFilter(全局过滤器),然后使用AddRequestHeader添加一个orign=gateway
请求头,表示从gateway网关服务路由的所有请求都会带上origin请求头,值为gateway,而从其它地方到达微服务的请求则没有这个请求头
:::
server:
#配置服务端口
port: 端口号
spring:
application:
#配置服务名称
name: gateway
cloud:
nacos:
#配置Nacos地址
server-addr: localhost:8848
#Gateway网关配置
gateway:
#全局过滤器配置,针对所有微服务
default-filters:
#添加orign=gateway请求头
- AddRequestHeader=origin,gateway
配置授权规则
:::tips 接下来点击资源右边的授权按钮添加一个授权规则,设置流控应用为gateway,接下来通过浏览器访问这个资源就会返回异常 :::