文章目录
授权规则
根据来源名称对请求进行拦截 ------>我们需要解析来源名称(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模式