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

news2024/11/27 5:33:33

目录

一、授权规则

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 {
    @Override
    public 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 {

    @Override
    public 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.coloradmin.cn/o/1056104.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【JAVA】普通IO数据拷贝次数的问题探讨

最近看到网上有些文章在讨论JAVA中普通文件IO读/写的时候经过了几次数据拷贝,如果从系统调用开始分析,以读取文件为例,数据的读取过程如下(以缓存I/O为例): 应用程序调用read函数发起系统调用,此…

1574. 删除最短的子数组使剩余数组有序

1574. 删除最短的子数组使剩余数组有序 原题链接:完成情况:解题思路:参考代码: 原题链接: 1574. 删除最短的子数组使剩余数组有序 https://leetcode.cn/problems/shortest-subarray-to-be-removed-to-make-array-so…

竞赛选题 机器视觉 opencv 深度学习 驾驶人脸疲劳检测系统 -python

文章目录 0 前言1 课题背景2 Dlib人脸识别2.1 简介2.2 Dlib优点2.3 相关代码2.4 人脸数据库2.5 人脸录入加识别效果 3 疲劳检测算法3.1 眼睛检测算法3.2 打哈欠检测算法3.3 点头检测算法 4 PyQt54.1 简介4.2相关界面代码 5 最后 0 前言 🔥 优质竞赛项目系列&#x…

redis runtime error: invalid memory address or nil pointer dereference

var Conn redis.Connfunc RedisInit(){Conn, err redis.Dial("tcp", "127.0.0.1:6379")if err ! nil {fmt.Println("redis.Dial err", err)return}fmt.Println("conn suc.11..", Conn)//defer Conn.Close()看看这两段代码的区别 而且…

游戏报错提示d3dx9_43.dll丢失怎么解决?这4个解决方法可以解决

随着科技的发展,电脑已经成为我们生活中不可或缺的一部分。然而,在使用电脑的过程中,我们可能会遇到各种问题,其中之一就是“d3dx9_43.dll丢失”。这个问题可能会影响到我们的电脑性能,甚至导致一些软件无法正常运行。…

管理经济学基本概念(三): 制定战略、竞争优势、员工利益等

1、怎么制定战略才能具备可持续的竞争优势 1.1、什么是可持续的竞争优势? 拥有以下两点,厂商就有了一种竞争优势,具有竞争优势的厂商能够赚取正值的经济利润: 以更低的成本像竞争对手一样提供相同的产品或服务效益 以相同的成本…

使用华为eNSP组网试验⑷-OSPF多区域组网

今天进行了OSPF的多区域组网试验,本来这是个很简单的操作,折腾了好长时间,根本原因只是看了别人写的配置代码,没有真正弄明白里面对应的规则。 一般情况下,很多单位都使用OSPF进行多区域的组网,大体分为1个…

[React] Zustand状态管理库

文章目录 1.Zustand介绍2.创建一个store3.使用方法3.1 获取状态3.2 更新状态3.3 访问存储状态3.4 处理异步数据3.5 在状态中访问和存储数组3.6 持续状态 4.总结 1.Zustand介绍 状态管理一直是现代程序应用中的重要组成部分, Zustand使用 hooks 来管理状态无需样板代码。 更少…

2023腾讯云服务器优惠价格表_10月更新报价

阿里云服务器10月报价表来了,和9月份价格差不多,再等一个月就到腾讯云双十一优惠活动了,腾讯云百科先来说说10月腾讯云服务器优惠价格表:轻量应用服务器2核2G3M带宽95元一年、2核4G5M带宽218元一年、2核2G4M带宽三年价540元一年、…

多头注意力机制

前面已经讲完了自注意力机制,简单来讲,就是对一组向量空间分别求内积,然后进行缩放,最后对不同的向量使用压缩后的分数累加求和。 1.多头是个什么东西? 实际上很简单,自注意力层的输出空间被分解为一组独立…

(ubuntu)Docker 安装linux 详情过程

文章目录 前言Docker 安装linux第一步:使用dokcker 拉取镜像:第二步:创建本地目录(用于挂载)第三步:(上传配置文件)修改配置文件第四步:创建docker容器第五步: 测试本地连…

检测防火墙是否开启、判断程序是否加入防火墙白名单(附源码)

VC常用功能开发汇总(专栏文章列表,欢迎订阅,持续更新...)https://blog.csdn.net/chenlycly/article/details/124272585C软件异常排查从入门到精通系列教程(专栏文章列表,欢迎订阅,持续更新...&a…

软考——软件设计师中级2023年11月备考(1.计算机组成原理)

一、计算机组成原理 1.数据的表示 1.1 十进制转R进制 方法:对十进制数除R取余,最后对余数取倒序 如: 1.2 原码反码补码 1.3 浮点数 1.4 校验码 —— 海明码 (非重点,了解即可) 海明码的构成方法&…

2023年Linux总结常用命令

1.常用命令 1.1创建文件夹 mkdir -p forever/my 1.2当前目录 pwd 1.3创建文件 touch 1.txt 1.4查看文件 cat 1.txt 1.5复制文件 说明:-r是复制文件夹 cp -r my myCopy 1.6删除文件 说明:-r带包删除文件夹,-f表示强制删除(保存问题) rm -r…

BEAPP:脑电批处理平台

摘要 脑电图(EEG)提供了与各种神经系统和神经精神疾病相关的脑功能信息。EEG包含复杂的高时间分辨率信息,而计算分析可以最大限度地利用这些信息。在这里,本研究提出了批量脑电图自动处理平台(BEAPP),这是一个自动化、灵活的EEG处理平台&…

freertos简介与移植

freertos是一个可裁剪的小型rtos系统,特点: 支持抢占式,合作式和时间片调度saferos衍生自freertos,更完整提供了一个用于低功耗的tickless模式系统的组件在创建时可以选择动态或者静态的ram,例如任务,消息…

python之阈值分割

阈值分割法是一种基于区域的图像分割技术,原理是把图像像素点分为若干类。图像阈值化分割是一种传统的最常用的图像分割方法,因其实现简单、计算量小、性能较稳定而成为图像分割中最基本和应用最广泛的分割技术。它特别适用于目标和背景占据不同灰度级范…

python之股票财务分析

#import akshare as ak import pandas as pd import matplotlib.pyplot as plt symbol1"资产负债表" symbol2"利润表" symbol3"现金流量表" #df1ak.stock_financial_report_sina(stock"601633",symbolsymbol1) #df2ak.stock_financial…

Linux CentOS7 vim多窗口编辑

我们在用vim编辑文件时,有各种需求。如有时需要在多个文件之间来回操作,一会关闭一个文件,一会再打开另外一个文件,这样来回操作显得太笨拙。有时,vim编辑多行的大文件,来回查看、编辑前面一部分及最后一部…

《从零开始的Java世界》03面向对象(进阶)

《从零开始的Java世界》系列主要讲解Javase部分,从最简单的程序设计到面向对象编程,再到异常处理、常用API的使用,最后到注解、反射,涵盖Java基础所需的所有知识点。学习者应该从学会如何使用,到知道其实现原理全方位式…