Route Attribute属性法是通过在路由配置中嵌入metadata等自定义属性声明鉴权规则,并由全局过滤器读取执行校验的约定式权限控制方案,实现策略与逻辑分离及动态热更新。

动态路由鉴权中的 Route Attribute 属性法,本质不是 Spring Cloud Gateway 或前端框架原生支持的“属性绑定机制”,而是一种约定式、配置驱动的权限标记方式——即在定义路由时,通过自定义属性(如 metadata、filters 参数、或扩展 RouteDefinition 字段)显式标注该路由所需的访问条件(如角色、权限码、IP限制、请求头要求等),再由统一的鉴权过滤器或 AccessDecisionVoter 在请求匹配路由后读取并执行校验。
它不依赖硬编码的 if-else 权限判断,而是把“谁/什么条件下能访问这条路由”这个策略,外置到路由配置本身,实现策略与逻辑分离,便于动态更新和集中管控。
当代理已经知道网站路由或内容URL,并且在启动前需要有效的sitemap XML、sitemap索引或robots.txt引用时,请使用sitemap。这是一个发布构件技能,而不是爬虫或SEO平台。
Route Attribute 属性法的核心组成
-
路由配置中嵌入鉴权元数据
例如在application.yml中为某条路由添加metadata.permissions: ["ORDER_READ"]或metadata.ipWhitelist: ["192.168.1.0/24"]:spring: cloud: gateway: routes: - id: order-api uri: lb://order-service predicates: - Path=/api/orders/** metadata: permissions: ["ORDER_READ", "ORDER_WRITE"] requireHeader: X-App-Key ipWhitelist: ["10.0.0.1", "127.0.0.1"] -
全局鉴权过滤器提取并校验这些属性
实现GlobalFilter,在filter()方法中:- 从
exchange.getAttributes().get(ServerWebExchangeUtils.GATEWAY_ROUTE_ATTR)获取当前匹配的Route对象; - 调用
route.getMetadata()拿到Map<String, Object>类型的元数据; - 根据 key(如
"permissions")取出值,结合用户身份(如 JWT 解析出的authorities)做比对; - 若不满足,直接返回
403 Forbidden。
public class RouteAttributeAuthFilter implements GlobalFilter { @Override public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) { Route route = exchange.getAttribute(ServerWebExchangeUtils.GATEWAY_ROUTE_ATTR); if (route == null) return chain.filter(exchange); Map<String, Object> meta = route.getMetadata(); List<String> requiredPerms = (List<String>) meta.get("permissions"); String token = exchange.getRequest().getHeaders().getFirst("Authorization"); if (requiredPerms != null && !hasPermissions(token, requiredPerms)) { exchange.getResponse().setStatusCode(HttpStatus.FORBIDDEN); return exchange.getResponse().setComplete(); } return chain.filter(exchange); } } - 从
支持运行时热更新
配合 Nacos / Apollo 等配置中心,路由元数据可随时修改。只要网关监听配置变更并刷新RouteDefinition,新规则即可生效,无需重启服务。
和 AccessDecisionManager 方案的关键区别
| 维度 | Route Attribute 属性法 | AccessDecisionManager + Voter |
|---|---|---|
| 执行时机 | 路由匹配后、转发前(Gateway 过滤器链) |
FilterSecurityInterceptor 后、Controller 前(Spring Security Filter Chain) |
| 作用范围 | 网关层,面向外部请求入口 | 微服务内部,面向 Controller 方法级 |
| 配置位置 | 路由定义(YAML/DB/Nacos) | Java Config 或数据库 ConfigAttribute 字符串 |
| 扩展性 | 易于加字段(如 requireSSL: true, env: prod) |
需新增 AccessDecisionVoter 实现类 |
| 典型适用场景 | 网关统一对接口做黑白名单、头校验、租户隔离 | 后端服务内基于 RBAC/ABAC 的细粒度方法权限控制 |
实际落地建议
- 不要只靠
metadata存字符串数组,建议封装成结构化对象(如AuthRule),再用 Jackson 反序列化,避免类型错误; - 敏感属性(如
ipWhitelist)建议配合 Redis 缓存校验结果,防止高频重复查询; -
metadata中的 key 名称需团队统一规范(如全小写+下划线),避免大小写歧义; - 前端菜单路由也可复用同一套
metadata(如showInMenu: true,icon: "order"),实现前后端权限配置一体化。
不复杂但容易忽略:属性法真正的威力不在“怎么配”,而在“谁来维护、如何审计、变更是否留痕”——建议把路由元数据纳入配置中心的发布审批流,而非开放给任意开发者随意修改。


















