SpringCloud Alibaba - Sentinel 授权规则、自定义异常结果

目录

一、授权规则

1.1、什么是授权规则

1.2、授权规则的配置

1.2.1、配置信息介绍

1.2.2、如何得到请求来源

1.2.3、实现步骤

a)给网关过来的请求添加请求头信息

b)在 订单微服务 中实现 RequestOriginParser 接口中的 parseOrigin 方法

c)在 Sentinel 控制台中添加授权规则

d)测试分析

二、自定义异常结果

2.1、用处

2.2、具体实现

2.2.1、自定义异常结果种类

2.2.2、实现 BlockExceptionHandler 接口

2.2.3、分析结果


一、授权规则


1.1、什么是授权规则

授权规则是对请求者的身份做一个判断,判断是否又权限来访问我.

这里大家肯定会想起 Spring Cloud Gateway 网关,也是所有请求都需要经过网关去身份认证,看你有没有权限访问我,这里为什么还要整一个授权规则呢?

可以这样想啊,所有请求经过网关路由到微服务,此时网关才能对请求者的身份做认证,但是如果你们公司出现了内鬼,把微服务的地址给泄露给不怀好意的人,那些哥们就可以绕过网关直接访问微服务,因此就需要 sentinel 的权限股则解决这个问题.

Sentinel 的授权规则就可以验证你的请求是从哪里来的,如果是从网关来的,就让你走,如果是其他地方来的,就进行拦截.

1.2、授权规则的配置

1.2.1、配置信息介绍

在 Sentinel 的控制台中,选择权限规则就可以添加规则.

  • 资源名:就是之前提到的“资源”,比如 /order/{orderId}.
  • 流控应用:填写调用者的名字.
  • 授权类型:白名单就是允许通过的名单,黑名单就想相反了.  比如你想要调用者允许从网关进来,那么流控应用就填写 “gateway”(这里需要配置,后面会讲),然后选择白名单即可.

1.2.2、如何得到请求来源

在 Sentinel 中有一个接口叫做 RequestOriginParser,通过他的方法叫 parseOrigin 就可以解析出请求者的来源. 只不过可惜的是,这个方法返回的结果永远是 default ,因此无法区分你是网关来的,还是浏览器来的,所以我们需要自己来实现这个接口.

具体的,我们只需要让网关来的请求和从浏览器来的请求的请求头信息不一样,然后实现 RequestOriginParser 接口的时候,在方法中进行一个判断就可以了.

1.2.3、实现步骤

a)给网关过来的请求添加请求头信息

利用网关过滤器,添加名字为 gateway 的 origin 头.

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

 

b)在 订单微服务 中实现 RequestOriginParser 接口中的 parseOrigin 方法
@Component
public class HeaderOriginParser implements RequestOriginParser {@Overridepublic String parseOrigin(HttpServletRequest httpServletRequest) {String origin = httpServletRequest.getHeader("origin");if(StringUtils.isEmpty(origin)) {return "blank";}return origin;}
}

Ps:要加上 Component 注解,交给容器去管理.

c)在 Sentinel 控制台中添加授权规则

d)测试分析

从浏览器中访问,就会被拦截.

Ps:这里我在网关中对以下资源放行通过

因此通过网关访问就不会被拦截

二、自定义异常结果


2.1、用处

默认情况下,发生限流、降级、授权拦截都会抛出异常到调用方.  而默认的异常返回结果上面的案例也看到了,直接返回给用户不得懵逼了,因此我们可以自定义返回异常的结果.

我们只需要实现 BlockExceptionHandler 接口. 因为这个接口中就是用来处理上述所有异常的 .

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

2.2、具体实现

2.2.1、自定义异常结果种类

 BlockException 包含很多子类,分别对应以下场景:

  • FlowException:限流异常.
  • ParamFlowException:热点参数限流的异常
  • DegradeException:降级异常.
  • AuthorityException:授权规则异常.
  • SystemBlockException:系统规则异常.

实现 BlockExceptionHandler 接口自定义返回异常结果时,就可以针对 BlockException 的不类型,返回对应的不同结果.

2.2.2、实现 BlockExceptionHandler 接口

在 订单服务 中,实现 BlockExceptionHandler 接口.

@Component
public class SentinelBlockHandler implements BlockExceptionHandler {@Overridepublic void handle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, BlockException e) throws Exception {String msg = "未知异常";int status = 429;if(e instanceof FlowException) {msg = "请求被限流了!";} else if(e instanceof DegradeException) {msg = "请求被降级了!";} else if(e instanceof ParamFlowException) {msg = "热点参数限流!";} else if(e instanceof AuthorityException) {msg = "请求没有权限!";status = 401;}httpServletResponse.setContentType("application/json;charset=utf-8");httpServletResponse.setStatus(status);httpServletResponse.getWriter().println("{message:"+msg+", status:"+status+"}");}}

Ps:不要忘了 Component 注解

2.2.3、分析结果

这里通过 授权规则 中的案例进行测试.

可以看到,不通过 网关,而通过浏览器直接访问就会触发自定义结果异常.

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/146479.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

排序:外部排序算法分析

1.外存与内存之间的数据交换 1.外存(磁盘) 操作系统以“块”为单位对磁盘存储空间进行管理,如:每块大小1KB 各个磁盘块内存放着各种各样的数据。 2.内存 磁盘的读/写以“块”为单位数据读入内存后才能被修改修改完了还要写回磁盘。 2.外…

Jmeter分布式压力测试

目录 1、场景 2、原理 3、注意事项 4、slave配置 5、master配置 6、脚本执行 1、场景 在做性能测试时,单台机器进行压测可能达不到预期结果。主要原因是单台机器压到一定程度会出现瓶颈。也有可能单机网卡跟不上造成结果偏差较大。 例如4C8G的window server机…

2023-10-01 LeetCode每日一题(买卖股票的最佳时机)

2023-10-01每日一题 一、题目编号 121. 买卖股票的最佳时机二、题目链接 点击跳转到题目位置 三、题目描述 给定一个数组 prices ,它的第 i 个元素 prices[i] 表示一支给定股票第 i 天的价格。 你只能选择 某一天 买入这只股票,并选择在 未来的某一…

[NOIP2012 提高组] 国王游戏(贪心,排序,高精度)

[NOIP2012 提高组] 国王游戏 题目描述 恰逢 H 国国庆,国王邀请 n n n 位大臣来玩一个有奖游戏。首先,他让每个大臣在左、右手上面分别写下一个整数,国王自己也在左、右手上各写一个整数。然后,让这 n n n 位大臣排成一排&…

Mac程序坞美化工具 uBar

uBar是一款为Mac用户设计的任务栏增强软件,它可以为您提供更高效和更个性化的任务管理体验。 以下是uBar的一些主要特点和功能: 更直观的任务管理:uBar改变了Mac上传统的任务栏设计,将所有打开的应用程序以类似于Windows任务栏的方…

xilinx的原语的使用

xilinx的原语的使用 在学习FPGA实现千兆网时需要GMII转RGMII,这就涉及了原语的使用,特此记录! 一、原语 与RGMII接口相关的原语: BUFG:全局时钟网络 BUFIO:只能采集IO的数据,采集IO数据的时候延时是最低的…

浅谈OV SSL 证书的优势

随着网络威胁日益增多,保护网站和用户安全已成为每个企业和组织的重要任务。在众多SSL证书类型中,OV(Organization Validation)证书以其独特的优势备受关注。让我们深入探究OV证书的优势所在,为网站安全搭建坚实的防线…

【自定义类型】--- 位段、枚举、联合

💓博客主页:江池俊的博客⏩收录专栏:C语言进阶之路👉专栏推荐:✅C语言初阶之路 ✅数据结构探索💻代码仓库:江池俊的代码仓库🎉欢迎大家点赞👍评论📝收藏⭐ 文…

React18+Ts项目配置husky、eslint、pretttier、commitLint

前言 我的项目版本如下: React: V18.2.0Node.js: V16.14.0TypeScript:最新版工具: VsCode 本文将采用图文详解的方式,手把手带你快速完成在React项目中配置husky、prettier、commitLint,实现编码规范的统…

使用sqlmap获取数据步骤

文章目录 1.使用sqlmap获取所有数据库2.使用sqlmap获取当前连接数据库3.使用sqlmap获取当前数据库下所有表名4.使用sqlmap获取当前数据库下某个表下所有列名5.使用sqlmap获取当前数据库下某个表下指定字段的数据6.测试当前用户是否是管理员7.使用burpsqlmap批量检测8.脱库命令9…

算法竞赛备赛之贪心算法训练提升,贪心算法基础掌握

1.区间问题 905.区间选点 给定N个闭区间[ai, bi],请你在数轴上选择尽量少的点,使得每个区间内至少包含一个选出的点。 输出选择的点的最小数量,位于区间端点上的点也算作是区间内。 将每个按区间的右端点从小到大排序 从前往后依次枚举每…

记录:Unity脚本的编写

目录 前言添加脚本到unity编写c#脚本查看效果 前言 在学习软件构造这门课的时候,对unity和c#进行了 一定程度的学习,包括简单的建立地形,添加对象,添加材质等,前不久刚好学习了如何通过c#脚本对模型进行操控&#xff…

五、2023.10.1.C++stl.5

文章目录 65、请说说 STL 的基本组成部分?66、请说说 STL 中常见的容器,并介绍一下实现原理?67、请说说 STL 中常见的容器,并介绍一下实现原理?68、请你来介绍一下 STL 的空间配置器(allocator)&#xff1…

分布式并行训练(DP、DDP、DeepSpeed)

[pytorch distributed] 01 nn.DataParallel 数据并行初步 数据并行 vs. 模型并行 数据并行:模型拷贝(per device),数据 split/chunk(对batch切分) 每个device上都拷贝一份完整模型,每个device分…

密码技术 (5) - 数字签名

一. 前言 前面在介绍消息认证码时,我们知道消息认证码虽然可以确认消息的完整性,但是无法防止否认问题。而数字签名可以解决否认的问题,接下来介绍数字签名的原理。 二. 数字签名的原理 数字签名和公钥密码一样,也有公钥和私钥&am…

字符串函数(一)

✨博客主页:小钱编程成长记 🎈博客专栏:进阶C语言 字符串函数(一) 0.前言1.求字符串长度的函数1.1 strlen(字符串长度) 2.长度不受限制的字符串函数2.1 strcpy(字符串拷贝&#xff0…

直播协议 python 常见直播协议

1. 推流、直播 和 点播分别是什么意思? 推流 主播将本地视频源和音频源推送到云服务器,也被称为“RTMP发布”。 直播 即直接观看主播实时推送过来的音视频数据。 点播 视频源已经事先存储于云服务器之上的音视频文件,观众随时可以观看。 目…

怒刷LeetCode的第22天(Java版)

目录 第一题 题目来源 题目内容 解决方法 方法一:回溯算法 方法二:基于位运算的回溯 第二题 题目来源 题目内容 解决方法 方法一:动态规划 方法二:分治法 方法三:前缀和数组 第三题 题目来源 题目内容…

Acwing 842. 排列数字

Acwing 842. 排列数字 知识点题目描述思路讲解代码展示 知识点 DFS 题目描述 思路讲解 DFS重点是:顺序!(暴力的手法)(递归) 用 path 数组保存排列,当排列的长度为 n 时,是一种方…

【Leetcode】 17. 电话号码的字母组合

给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合。答案可以按 任意顺序 返回。 给出数字到字母的映射如下(与电话按键相同)。注意 1 不对应任何字母。 示例 1: 输入:digits "23" 输出&…