微服务11-Sentinel中的授权规则以及Sentinel服务规则持久化

文章目录

授权规则

根据来源名称对请求进行拦截 ------>我们需要解析来源名称(RequestOriginParser默认解析都为default),所以我们要自定义一个实现类(根据请求头解析,给运行访问的来源+一个请求头

防止绕过,请求我们的服务,对请求来源进行授权

1.对于我们客户端请求过来的资源,服务需要进行判断是浏览器还是网关

自定义实现RequestOriginParser请求解析器来获取请求的来源


2.尝试在request请求头中加一个origin请求头,给网关加一个

从网关来的请求就有这个请求头,而从浏览器来的就没有------>以此做一个区分

java 复制代码
@Component
public class HeaderOriginParser implements RequestOriginParser {
    @Override
    public String parseOrigin(HttpServletRequest httpServletRequest) {
//1.获取请求头
        String origin = httpServletRequest.getHeader("origin");
//2.进行请求头的非空判断
        if (StringUtils.isEmpty(origin)) {
            origin = "blank";
        }
        return origin;
    }
}

3.对请求头进行资源处理后,还需要对gateway网关添加origin请求头中参数值,然后我们要通过网关路由userservice服务时,就会带origin请求头,在资源处理器进行处理时就会放行;

yml 复制代码
 gateway:
      routes:
        - id: user-service # 路由标示,必须唯一
          uri: lb://userservice # 路由的目标地址
          predicates: # 路由断言,判断请求是否符合规则
            - Path=/user/** # 路径断言,判断路径是否以/user开头,如果是则符合,跳转路由
 
        - id: order-service
          uri: lb://orderservice
          predicates:
            - Path=/order/**
          filters: # 过滤器添加一个请求头
            - AddRequestHeader=Truth,Itcast is freaking aowsome!
      default-filters: # 对所有路由生效
        - AddRequestHeader=origin,gateway #添加origin请求头,值为gateway

此时我们localhost:8081/user/1还是能够访问的,还没有配置授权规则

4.最后在Sentinel中配置授权规则只有网关过来才能访问

5.此时绕过网关访问,会发现被拦截


6.然后我们通过网关访问,因为在之前的配置类中加入了一个网关请求的过滤器

认证我们的请求加上一个叫authorization且值为admin的参数,否则拦截

过滤器代码

java 复制代码
    @Override
    public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
        ServerHttpRequest request = exchange.getRequest();
        //1.得到request中的所有参数
        MultiValueMap<String, String> params = request.getQueryParams();
 
        //2.获取里面含有authorization的参数
        String auth = params.getFirst("authorization");
 
        //3.判断参数是否符合:authorization==admin
        if("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模式


相关推荐
逄逄不是胖胖34 分钟前
《动手学深度学习》-60translate实现
人工智能·python·深度学习
橘颂TA35 分钟前
【测试】自动化测试函数介绍——web 测试
python·功能测试·selenium·测试工具·dubbo
爱学习的阿磊38 分钟前
Python上下文管理器(with语句)的原理与实践
jvm·数据库·python
m0_7369191042 分钟前
Python面向对象编程(OOP)终极指南
jvm·数据库·python
one____dream1 小时前
【网安】Reverse-非常规题目
linux·python·安全·网络安全·ctf
冷雨夜中漫步1 小时前
python反转列表reverse()和[::-1]哪个效率更高
开发语言·python
rainbow68891 小时前
Python面向对象编程与异常处理实战
开发语言·python
weixin199701080161 小时前
锦程物流item_get - 获取详情接口对接全攻略:从入门到精通
数据库·python
2501_907136821 小时前
基于Python+QT6的移动硬盘弹出工具
python·软件需求
2501_907136822 小时前
python 界面元素控件库工具,可以看到python的可视控件和使用方法
python·软件需求