spring: cloud: gateway: routes: # 认证中心 - id: jnpf-oauth uri: lb://jnpf-oauth predicates: - Path=/api/oauth/** filters: - StripPrefix=2 # 系统基础服务 - id: jnpf-system uri: lb://jnpf-system predicates: - Path=/api/system/** filters: - StripPrefix=2 # lims 业务服务 - id: jnpf-lims uri: lb://jnpf-lims predicates: - Path=/api/lims/** filters: - StripPrefix=2 # lims 兼容路由:前端 dist 与 DB 数据接口仍用 /api/extend/**(69 处硬编码), # 退役条件见 docs/superpowers/specs/2026-07-18-eln-module-design.md §7 - id: jnpf-lims-legacy uri: lb://jnpf-lims predicates: - Path=/api/extend/** filters: - StripPrefix=2 # eln 业务服务(空壳占位,profile 起用) - id: jnpf-eln uri: lb://jnpf-eln predicates: - Path=/api/eln/** filters: - StripPrefix=2 # 审计追踪(2026-08-11 搬入 jnpf-biz-common,cx-audit 退役)。 # **路由与前缀刻意保持不变**:uri 直接指向 biz-common,/api/audit/** 继续可用, # 前端与 42 个回归脚本零改动。审计能力因此有两条入口——本条与下面的 /api/biz/**, # 都落到同一个服务,不冲突。 - id: jnpf-audit uri: lb://jnpf-biz-common predicates: - Path=/api/audit/** filters: - StripPrefix=2 # 公共业务能力聚合服务(统一前缀 /api/biz/**:新增能力零网关改动, # 形如 /api/biz/onlyoffice/xxx → StripPrefix=2 → 服务内 /onlyoffice/xxx) - id: jnpf-biz-common uri: lb://jnpf-biz-common predicates: - Path=/api/biz/** filters: - StripPrefix=2 # DMS 文档管理服务 - id: jnpf-dms uri: lb://jnpf-dms predicates: - Path=/api/dms/** filters: - StripPrefix=2 # 报表服务 - id: jnpf-datareport uri: lb://jnpf-datareport predicates: - Path=/api/datareport/** filters: - StripPrefix=2 # 🔴 表单外链专用路由(2026-08-11 平台聚合)。**必须排在下面 jnpf-visualdev 通用路由之前** # ——网关按配置顺序取第一个匹配项,放到后面就永远匹配不到。 # 起因:聚合后 visualdev 的 ShortLinkController 与 message 的在同一 JVM 内路径相撞 #(详见 VisualdevShortLinkController 类注释),故把它的内部路径改名为 /VisualdevShortLink。 # 这里用 RewritePath 原样重写,保证**对外路径 /api/visualdev/ShortLink/** 一字不变**, # 已生成并发出去的表单外链继续有效。正则里 (?/?.*) 的可选斜杠是为了让 # PUT /api/visualdev/ShortLink(无尾段)也能正确重写成 /VisualdevShortLink。 - id: jnpf-visualdev-shortlink uri: lb://jnpf-visualdev predicates: - Path=/api/visualdev/ShortLink/** filters: - RewritePath=/api/visualdev/ShortLink(?/?.*), /VisualdevShortLink$\{segment} # 可视化开发服务 - id: jnpf-visualdev uri: lb://jnpf-visualdev predicates: - Path=/api/visualdev/** filters: - StripPrefix=2 # 工作流服务 - id: jnpf-workflow uri: lb://jnpf-workflow predicates: - Path=/api/workflow/** filters: - StripPrefix=2 # 文件服务 - id: jnpf-file uri: lb://jnpf-file predicates: - Path=/api/file/** filters: - StripPrefix=2 # 多租户 - id: jnpf-tenant uri: lb://jnpf-tenant predicates: - Path=/api/tenant/** filters: - StripPrefix=2 # 消息 - id: jnpf-message uri: lb://jnpf-message predicates: - Path=/api/message/** filters: - StripPrefix=2 # 任务调度 - id: jnpf-scheduletask uri: lb://jnpf-scheduletask predicates: - Path=/api/scheduletask/** filters: - StripPrefix=2 # 权限 - id: jnpf-permission uri: lb://jnpf-permission predicates: - Path=/api/permission/** filters: - StripPrefix=2 # 大屏 - id: jnpf-visualdata uri: lb://jnpf-visualdata predicates: - Path=/api/blade-visual/** filters: - StripPrefix=2 # app - id: jnpf-app uri: lb://jnpf-app predicates: - Path=/api/app/** filters: - StripPrefix=2 # 工作流表单 - id: jnpf-flowForm uri: lb://jnpf-flowForm predicates: - Path=/api/flowForm/** filters: - StripPrefix=2 #接口放行地址 与GatewayWhite中的默认URL合并 gateway: #禁止访问 block-url: # 审计写端点 /Internal/** 只供服务间 Feign 调用(直连 lb://jnpf-audit,不经网关); # 经网关的外部请求一律 AD101 禁止访问,堵任意登录用户伪造投递审计事件(append-only 完整性)。 # AuthFilter 的 block 检查在鉴权链最前、匹配的是 StripPrefix 前原始路径 /api/audit/Internal/**。 # 服务侧 AuditInternalController 另有 SA-SAME-TOKEN 校验兜底(双保险,见该类注释)。 - /api/audit/Internal/** # Discovery Locator 自动路由标准路径:bootstrap-dev.yml discovery.locator.enabled=true + # lowerCaseServiceId=true 会为每个注册服务生成 /jnpf-audit/**,绕过上面的 /api/audit/** 前缀 → # 补堵其 /Internal 写端点标准路径(小写服务名,与 lowerCaseServiceId 生成形态一致)。 # 大写变体 /JNPF-AUDIT/Internal/** 实测在下游 Spring MVC 因路径大小写敏感 404(不达 record()), # 双斜杠变体经平台"非法请求"过滤器拦截,均不落库;服务侧 SAME-TOKEN 是权威边界,此处只覆盖数据面标准路径。 - /jnpf-audit/Internal/** # DMS Internal 端点仅允许服务间直连;服务侧仍必须校验 SA-SAME-TOKEN。 - /api/dms/Internal/** - /jnpf-dms/Internal/** # 🔴 2026-08-11 audit 搬入 jnpf-biz-common 后**新增的两条到达路径**,缺一条就是绕过缺口: # · /api/biz/Internal/** —— biz-common 的对外前缀 /api/biz/** 同样 StripPrefix=2, # `/api/biz/Internal/audit/events` 去掉两段后正是服务内的 `/Internal/audit/events`; # · /jnpf-biz-common/Internal/** —— Discovery Locator 按新服务名生成的标准路径 # (原 /jnpf-audit/** 那条仍需保留:discovery.yaml 里 jnpf-audit 作为别名依然注册)。 # 设计文档 2026-08-07-biz-common-design.md §4.2 预先写明了"出现 Internal 端点必须同时加两条", # 这里是它第一次真正生效。 - /api/biz/Internal/** - /jnpf-biz-common/Internal/** #不验证Token, 记录访问 white-url: # OnlyOffice 编辑保存回调(平台补丁 #9):DS 既不是 JNPF 服务(注入不了 SA-SAME-TOKEN) # 也无登录态,直连服务端口按 L042 必被 inner-auth 拒,故只能经网关且必须放行。 # 放行不等于裸奔——转发阶段的 MvcSecurityConfig#getMyHeadersFilter 与白名单相互独立, # 仍会注入 INNER_GATEWAY_TOKEN;真正的安全边界是服务侧对 OnlyOffice 回调 JWT 的验签。 # ⚠️ 只放行 callback 这一条精确路径,不可扩成 /api/biz/onlyoffice/** # (config 端点会下发 securityKey,必须保持登录态保护)。 - /api/biz/onlyoffice/callback # ELN 模板填写数据:无登录 token,安全边界是端点内部的 8 小时专用 Ticket 校验。 - /api/eln/onlyoffice/template-fill/data #- /api/message/Notice #- /api/permission/Users/* #放行不记录 exclude-url: #禁止访问地址的白名单IP white-ip: #- 192.168