1.4 授权规则

一、授权规则

  1. 授权规则可以对调用方的来源做控制,有白名单和黑名单两种方式

    1. 白名单:来源(origin)在白名单内的调用者允许访问

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

  2. Sentinel是通过RequestOriginParser这个接口的parseOrigin来获取请求的来源的

    public interface RequestOriginParser {
        
        /**
         * 从请求request对象中获取origin,获取方式自定义
         */
        String parseOrigin(HttpServletRequest request);
    }
    
    // 示例重写,在请求头中获取请求
    @Component
    public class HeardOriginParser implements RequestOriginParser {
        
        @Overried
        public String parseOrigin(HttpServletRequest request) {
            String origin = request.getHeard("origin");
            if (StringUtils.isEmpty(origin)) {
                return "black";
            }
            return origin;
        }
        
    }

    备注:这样设定,可以保证微服务获取原,并判断是否可以进行访问,假如有网关,可以在网关中添加请求头,进行联调配置

  3. 在网关中假如请求头

    spring:
      cloud:
      	gateway:
      	  default-filters:
      	    - AddRequestHeard=origin,gateway  # 添加名为origin的请求头,值为gateway

    备注:利用网关的过滤器添加名为gateway的origin头

  4. Sentinel中添加授权规则,资源名选择制定资源接口,流控应用选择上面获取道的内容,授权类型,白名单即可

二、自定义异常结果

  1. 默认情况下,发生限流、降级、授权拦截时,都会抛出异常到调用方。如果要自定义异常时的返回结果,需要实现BlockExceptionHandler接口:

    public interface BlockExceptionHandler {
        
        /**
         * 处理请求被限流、降级、授权拦截时抛出的异常:BlockException
         */
        void handle(HttpServletRequest request, HttpServletResponse response, BlockException e) throws Exception;
        
    }

    备注:BlockExceptionHandler有很多子类,分别对应不同场景

    异常
    说明

    FlowException

    限流异常

    ParamFlowException

    热点参数限流异常

    DegradeException

    降级异常

    AuthorityException

    授权规则异常

    SystemBlockException

    系统规则异常

  2. 自定异常返回

    @Component
    public class SentinelBlockHandler implements BlockExceptionHandler {
        
        @Override
        public void handle(HttpServletRequest request, HttpServletResponse response, BlockException e) throws Exception {
            String msg = "未知异常";
            int status = 429;
            if (e instanceof FlowException) {
                msg = "请求被限流了";
            } else if (e instanceof DegradeException) {
                msg = "热点参数限流";
            } else if (e instanceof AuthorityException) {
                msg = "请求没有权限";
                status = 401;
            }
            
            response.setContentType("application/json;charset=utf-8");
            response.setStatus(status);
            response.getWriter().println("")    // 拼接一个json数据返回给前端
        }
        
    }

最后更新于

这有帮助吗?