Sentinel 授权规则

文章目录

Sentinel 授权规则

基于 spring-cloud-demo · order-service · 黑白名单控制调用来源


一、依赖与接入

xml 复制代码
<!-- Sentinel 客户端 -->
<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
</dependency>
yaml 复制代码
spring:
  cloud:
    sentinel:
      transport:
        dashboard: 127.0.0.1:8100 # 控制台

二、授权规则是什么

授权规则(AuthorityRule)控制 谁可以访问 某资源


三、控制台参数字段(完整)

控制台字段 JSON 字段 说明
资源名 resource 保护的资源
流控应用 limitApp 调用方 origin,多个用逗号分隔
授权类型 strategy 0=白名单,1=黑名单
strategy 含义
0 白名单 仅 limitApp 中的来源允许
1 黑名单 limitApp 中的来源 拒绝

四、代码案例

整体链路:Gateway 加 Header → order-service 用 Parser 解析 → Dashboard 流控应用填同一字符串。

4.1 Gateway(调用方)设置来源

经网关转发的请求带上来源标识( gateway 模块):

yaml 复制代码
spring:
  cloud:
    gateway:
      server:
        webflux:
          routes:
            - id: order-route
              uri: lb://order-service
              predicates:
                - Path=/order/**
              filters:
                - AddRequestHeader=X-Request-Source, gateway # 请求头标记来源为 gateway

头名 X-Request-Source 与值 gateway 可自定义,但 Parser 读的头名 和 Dashboard 流控应用 须与这里的值对齐。

4.2 order-service 解析来源 RequestOriginParser

java 复制代码
@Component
public class HeaderOriginParser implements RequestOriginParser { // 注册为 Bean

    @Override
    public String parseOrigin(HttpServletRequest request) {
        String origin = request.getHeader("X-Request-Source"); // 与 Gateway AddRequestHeader 头名一致
        return origin != null ? origin : "unknown"; // 无头时用 unknown
    }
}

4.3 流控应用填什么?

填 RequestOriginParser.parseOrigin() 返回的字符串 ,不是 Nacos 服务名,Sentinel 不会自动识别 Gateway。

环节 配置 本例取值
Gateway 加 Header AddRequestHeader=X-Request-Source, gateway 头值 gateway
Parser 读 Header request.getHeader("X-Request-Source") 返回 gateway
Dashboard 流控应用 limitApp 填 gateway

白名单示例:资源名 /order/read,流控应用 gateway,授权类型 白名单 → 仅经网关转发的请求放行,直连 order-service(无该 Header)会被拒绝。

测试:

bash 复制代码
# 模拟经 Gateway 转发(带来源头)→ 白名单放行
curl -H "X-Request-Source: gateway" "http://127.0.0.1:8080/order/read"

# 直连且无来源头 → origin=unknown → 白名单 gateway 时拒绝
curl "http://127.0.0.1:8080/order/read"

五、JSON 规则片段

持久化见 sentinel-规则持久化.md,rule-type: authority。

黑名单示例:

json 复制代码
[
  {
    "resource": "/order/read",
    "limitApp": "blocked-app,malicious",
    "strategy": 1
  }
]

白名单示例:

json 复制代码
[
  {
    "resource": "/order/write",
    "limitApp": "gateway,admin",
    "strategy": 0
  }
]
JSON 字段 说明
limitApp 来源标识,与 RequestOriginParser 返回值一致
strategy 0白 / 1黑

参考官方文档

相关推荐
geovindu几秒前
rust:Memento Pattern(续)
开发语言·后端·设计模式·rust·行为模式·备忘录模
马优晨9 分钟前
JAVA 中 VO 实体类是什么意思,为什么要做这个
java·开发语言·状态模式·java vo·java vo是什么
Aurorar0rua17 分钟前
CS50 x 2024 Notes Python - 01
开发语言·python·学习方法
茉莉玫瑰花茶1 小时前
GO [ 标准库 ]
开发语言·后端·golang
半杯咖啡半行码1 小时前
C++11核心特性详解:从C++11到C++20 的现代C++指南
开发语言·c++
2601_966949652 小时前
如何判断实时行情数据是否已经更新?从时间戳、交易时段到行情有效性
开发语言·python·数据分析·pandas·量化交易·股票数据·quantdash
架构师伯子明2 小时前
QT+OpenGL(3):FBO离屏渲染
开发语言·qt
李福春2 小时前
技术思考问题6:技术演讲该晒成功架构,还是交代失败与取舍?
java·开发语言·架构·computer use·深圳同盟·腾讯云架构师技术同盟·反演思维
变与不变8063 小时前
防抖节流详解
开发语言·前端·javascript
雪域迷影3 小时前
Python Django 7 小时课程
开发语言·python·django