多功能网站建设服务至上,网页制作全过程视频,双喜常州网站建设,大美工网站文章目录 授权规则自定义异常结果规则持久化实现Push模式 授权规则
根据来源名称对请求进行拦截 ——我们需要解析来源名称#xff08;RequestOriginParser默认解析都为default#xff09;#xff0c;所以我们要自定义一个实现类#xff08;根据请求头解析#xff0c… 文章目录 授权规则自定义异常结果规则持久化实现Push模式 授权规则
根据来源名称对请求进行拦截 ——我们需要解析来源名称RequestOriginParser默认解析都为default所以我们要自定义一个实现类根据请求头解析给运行访问的来源一个请求头
防止绕过请求我们的服务对请求来源进行授权 1.对于我们客户端请求过来的资源服务需要进行判断是浏览器还是网关
自定义实现RequestOriginParser请求解析器来获取请求的来源 2.尝试在request请求头中加一个origin请求头给网关加一个
从网关来的请求就有这个请求头而从浏览器来的就没有——以此做一个区分
Component
public class HeaderOriginParser implements RequestOriginParser {Overridepublic String parseOrigin(HttpServletRequest httpServletRequest) {
//1.获取请求头String origin httpServletRequest.getHeader(origin);
//2.进行请求头的非空判断if (StringUtils.isEmpty(origin)) {origin blank;}return origin;}
}3.对请求头进行资源处理后还需要对gateway网关添加origin请求头中参数值然后我们要通过网关路由userservice服务时就会带origin请求头在资源处理器进行处理时就会放行 gateway:routes:- id: user-service # 路由标示必须唯一uri: lb://userservice # 路由的目标地址predicates: # 路由断言判断请求是否符合规则- Path/user/** # 路径断言判断路径是否以/user开头如果是则符合跳转路由- id: order-serviceuri: lb://orderservicepredicates:- Path/order/**filters: # 过滤器添加一个请求头- AddRequestHeaderTruth,Itcast is freaking aowsome!default-filters: # 对所有路由生效- AddRequestHeaderorigin,gateway #添加origin请求头值为gateway此时我们localhost:8081/user/1还是能够访问的还没有配置授权规则
4.最后在Sentinel中配置授权规则只有网关过来才能访问 5.此时绕过网关访问会发现被拦截 6.然后我们通过网关访问因为在之前的配置类中加入了一个网关请求的过滤器 认证我们的请求加上一个叫authorization且值为admin的参数否则拦截
过滤器代码 Overridepublic MonoVoid filter(ServerWebExchange exchange, GatewayFilterChain chain) {ServerHttpRequest request exchange.getRequest();//1.得到request中的所有参数MultiValueMapString, String params request.getQueryParams();//2.获取里面含有authorization的参数String auth params.getFirst(authorization);//3.判断参数是否符合:authorizationadminif(admin.equals(auth)){return chain.filter(exchange);}//4.进行拦截,并且设置响应状态码exchange.getResponse().setStatusCode(HttpStatus.UNAUTHORIZED);return exchange.getResponse().setComplete();}
}总结授权生效
自定义异常结果 自定义异常 最重要的两个接口
RequestOriginParser——用来解析请求资源的一般用于授权规则里头
BlockExceptionHandler——用来处理异常根据是限流异常还是热点参数异常还是降级异常。。。设置状态信息 规则持久化
场景当我们的服务重启时Sentinel会进行重启服务会丢失
原因Sentinel的默认模式会将默认的规则放到内存中所以会丢失 对Sentinel推送规则进行监听一旦发现变化发送数据库定时
缺点时效性较差因为它是定时将规则保存在数据库中比如你数据刚保存然后你立马调用此时就不会数据保存了 将配置规则先推送到配置中心nacos之类的然后我们的Sentinel客户端监听nacos配置变更就会完成本地配置更新——本质上是利用nacos的监听特质
实现Push模式