文章目录
- [Sentinel 授权规则](#Sentinel 授权规则)
-
- 一、依赖与接入
- 二、授权规则是什么
- 三、控制台参数字段(完整)
- 四、代码案例
-
- [4.1 Gateway(调用方)设置来源](#4.1 Gateway(调用方)设置来源)
- [4.2 order-service 解析来源 RequestOriginParser](#4.2 order-service 解析来源 RequestOriginParser)
- [4.3 流控应用填什么?](#4.3 流控应用填什么?)
- [五、JSON 规则片段](#五、JSON 规则片段)
- 参考官方文档
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黑 |