当前位置: 首页 > news >正文

Sentinel 授权规则详解与自定义异常处理

Sentinel 授权规则详解与自定义异常处理

在微服务系统中,权限控制和访问保护是至关重要的一环。本文将详细介绍如何通过 Sentinel 的 授权规则(AuthorityRule) 控制资源访问权限,并结合实际案例说明如何设置白名单与黑名单,以及如何实现 自定义异常返回,提升系统的稳定性与用户体验。


一、Sentinel 授权规则

授权规则用于对资源进行访问权限控制,其核心思想是:
给指定资源配置“流控应用”,然后通过 白名单黑名单 控制不同来源是否能访问。

  • 白名单(Whitelist):只有在白名单中的应用可以访问。
  • 黑名单(Blacklist):黑名单中的应用不能访问,其他应用可以正常访问。

如何设置请求来源(流控应用)?

Sentinel 默认不识别请求的来源,我们需要自定义 RequestOriginParser 接口来识别请求参数,从而指定来源。

自定义来源解析器
package com.southwind.configuration;import com.alibaba.csp.sentinel.adapter.servlet.callback.RequestOriginParser;
import org.springframework.util.StringUtils;import javax.servlet.http.HttpServletRequest;public class RequestOriginParserDefinition implements RequestOriginParser {@Overridepublic String parseOrigin(HttpServletRequest request) {String name = request.getParameter("name");if (StringUtils.isEmpty(name)) {throw new RuntimeException("name is null");}return name;}
}
注入配置类使其生效
package com.southwind.configuration;import com.alibaba.csp.sentinel.adapter.servlet.callback.WebCallbackManager;
import org.springframework.context.annotation.Configuration;import javax.annotation.PostConstruct;@Configuration
public class SentinelConfiguration {@PostConstructpublic void init() {WebCallbackManager.setRequestOriginParser(new RequestOriginParserDefinition());}
}

二、授权规则效果展示

示例:假设我们对接口 /test 添加授权规则,限制访问来源。

白名单效果

配置白名单为 aaa,那么只有 name=aaa 的请求能通过:

http://localhost:8080/test?name=aaa

其他任何非 aaa 的请求都将被拦截。

(示意图:白名单正常访问请求截图)


黑名单效果

配置黑名单为 tom,表示禁止 name=tom 的请求:

http://localhost:8080/test?name=tom

其它名称的请求如 name=jerry 可以正常访问。

(示意图:黑名单拦截请求截图)


三、自定义规则异常处理

当请求被 Sentinel 拦截(如限流、降级、授权失败等),可以通过 UrlBlockHandler 接口进行统一异常处理,返回更加友好的信息。

创建自定义异常处理器
package com.southwind.handler;import com.alibaba.csp.sentinel.adapter.servlet.callback.UrlBlockHandler;
import com.alibaba.csp.sentinel.slots.block.BlockException;
import com.alibaba.csp.sentinel.slots.block.degrade.DegradeException;
import com.alibaba.csp.sentinel.slots.block.flow.FlowException;import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;public class ExceptionHandler implements UrlBlockHandler {@Overridepublic void blocked(HttpServletRequest request, HttpServletResponse response, BlockException e) throws IOException {response.setContentType("text/html;charset=utf-8");String msg = "访问受限:";if (e instanceof FlowException) {msg += "触发限流";} else if (e instanceof DegradeException) {msg += "触发降级";}response.getWriter().write(msg);}
}
在配置类中注册异常处理器
@Configuration
public class SentinelConfiguration {@PostConstructpublic void init() {WebCallbackManager.setUrlBlockHandler(new ExceptionHandler());}
}

四、总结

功能模块说明
授权规则通过白名单/黑名单控制来源访问权限
请求来源设置实现 RequestOriginParser 指定来源参数
自定义异常实现 UrlBlockHandler 提供更友好提示
配置生效@Configuration 中注入配置

通过上述配置,我们不仅实现了资源访问控制,还优化了 Sentinel 异常返回信息,让系统既安全又具备良好的用户体验。


参考资料:

  • Sentinel 官网:https://github.com/alibaba/Sentinel
  • Spring Boot + Sentinel 实践示例

如觉得有帮助,欢迎点赞、收藏、评论支持!
更多后端开发实践内容持续更新中。

http://www.lqws.cn/news/534529.html

相关文章:

  • Tailwind CSS 尺寸控制
  • c++多线程编程
  • 《聊一聊ZXDoc》之汽车标定、台架标定、三高标定
  • 基于定制开发开源AI智能名片S2B2C商城小程序源码的H5游戏开发模式创新研究
  • 从零开始的云计算生活——第二十四天,重起航帆,初见MySQL数据库
  • 智能体决策框架对决:ReAct极速响应 vs Plan-and-Execute稳控全局
  • 【全志V821_FoxPi】3-2 Linux 5.4 SPI + XPT2046触摸(ADS7846) + tslib
  • SQL SERVER存储过程
  • 分享一些实用的PHP函数(对比js/ts实现)
  • VIVADO设定寄存器/存储器的初始值
  • 深入解析与修复 Linux 中的种种依赖项错误:Dependencies packages error solution
  • 【UniApp 日期选择器实现与样式优化实践】
  • 03.图生图基础工作流|提示词自动化|存储节点预设|提示词风格化
  • 以太网基础与 VLAN 配置实验
  • Vue3中的watch详解:掌握响应式侦听的艺术
  • 本地部署开源时间跟踪工具 Kimai 并实现外部访问( Windows 版本)
  • springboot集成mqtt收发消息
  • python + opencv实现简单的文字水印
  • 【LLM论文阅读】
  • 如果你在为理解RDA、PCA 和 PCoA而烦恼,不妨来看看丨TomatoSCI分析日记
  • [Andrej Karpathy] 大型语言模型作为新型操作系统
  • vue3 json 转 实体
  • 2D 基准情况下贝叶斯优化应用的概率推理
  • Ubuntu下布署mediasoup-demo
  • zabbix监控Centos 服务器
  • 波动方程能量守恒证明
  • dockers virbox 安装
  • COZE API上传文件 直接从前端发送就可以,而通过后端发请求给CozeAPI就不行,为什么?
  • Spring Boot 部署与打包方式详解(Jar vs War)
  • Windows命令连接符的安全风险分析与防御策略