1.4 授权规则
一、授权规则
授权规则可以对调用方的来源做控制,有白名单和黑名单两种方式
白名单:来源(origin)在白名单内的调用者允许访问
黑名单:来源(origin)在黑名单内的调用者不允许访问
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; } }备注:这样设定,可以保证微服务获取原,并判断是否可以进行访问,假如有网关,可以在网关中添加请求头,进行联调配置
在网关中假如请求头
spring: cloud: gateway: default-filters: - AddRequestHeard=origin,gateway # 添加名为origin的请求头,值为gateway备注:利用网关的过滤器添加名为gateway的origin头
Sentinel中添加授权规则,资源名选择制定资源接口,流控应用选择上面获取道的内容,授权类型,白名单即可
二、自定义异常结果
默认情况下,发生限流、降级、授权拦截时,都会抛出异常到调用方。如果要自定义异常时的返回结果,需要实现BlockExceptionHandler接口:
public interface BlockExceptionHandler { /** * 处理请求被限流、降级、授权拦截时抛出的异常:BlockException */ void handle(HttpServletRequest request, HttpServletResponse response, BlockException e) throws Exception; }备注:BlockExceptionHandler有很多子类,分别对应不同场景
异常说明FlowException
限流异常
ParamFlowException
热点参数限流异常
DegradeException
降级异常
AuthorityException
授权规则异常
SystemBlockException
系统规则异常
自定异常返回
@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数据返回给前端 } }
最后更新于
这有帮助吗?