介绍

:::tips 授权规则可以对请求方来源做判断和控制,有白名单和黑名单两种方式

  • 白名单:来源(origin)在白名单内的调用者允许访问
  • 黑名单:来源(origin)在黑名单内的调用者不允许访问

点击左侧菜单的授权,可以看到授权规则

  • 资源名:就是受保护的资源
  • 流控应用:就是来源者的名单
    • 如果是勾选白名单,则名单中的来源被许可访问,其他来源禁止访问
    • 如果是勾选黑名单,则名单中的来源被禁止访问,其他来源允许访问

image.png

如果需要允许请求从gateway到服务,不允许浏览器访问服务,那么白名单中就要填写网关的来源名称(origin) :::

获取请求来源(origin)

:::tips Sentinel是通过RequestOriginParser这个接口的parseOrigin方法来获取请求来源的,这个方法的作用就是从请求对象中获取请求者的origin值并返回。默认情况下,Sentinel不管请求者从哪里来,返回值永远是default,也就是说一切请求的来源都被认为是一样的值(default),因此需要自定义这个接口的实现类,让不同的请求返回不同的origin :::

  1. //实现RequestOriginParser接口,让不同的请求返回不同的origin
  2. @Component
  3. public class HeaderOriginParser implements RequestOriginParser {
  4. @Override
  5. public String parseOrigin(HttpServletRequest httpServletRequest) {
  6. //从请求头中获取orign
  7. String origin = httpServletRequest.getHeader("origin");
  8. //非空判断
  9. if(StringUtils.isEmpty(origin)){
  10. origin = "blank";
  11. }
  12. return origin;
  13. }
  14. }

添加请求头

:::tips 既然是从请求头中获取origin值,就必须让所有从gateway路由到微服务的请求都带上origin请求头,可以通过GatewayFilter来实现统一添加请求头

修改gateway网关工程的配置文件,添加一个defaultFilter(全局过滤器),然后使用AddRequestHeader添加一个orign=gateway请求头,表示从gateway网关服务路由的所有请求都会带上origin请求头,值为gateway,而从其它地方到达微服务的请求则没有这个请求头 :::

  1. server:
  2. #配置服务端口
  3. port: 端口号
  4. spring:
  5. application:
  6. #配置服务名称
  7. name: gateway
  8. cloud:
  9. nacos:
  10. #配置Nacos地址
  11. server-addr: localhost:8848
  12. #Gateway网关配置
  13. gateway:
  14. #全局过滤器配置,针对所有微服务
  15. default-filters:
  16. #添加orign=gateway请求头
  17. - AddRequestHeader=origin,gateway

配置授权规则

:::tips 接下来点击资源右边的授权按钮添加一个授权规则,设置流控应用为gateway,接下来通过浏览器访问这个资源就会返回异常 :::