刘光辉
昨天 bb638871a7fb692d80f1b7a758f991dc0879002c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
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/** 一字不变**,
        # 已生成并发出去的表单外链继续有效。正则里 (?<segment>/?.*) 的可选斜杠是为了让
        # PUT /api/visualdev/ShortLink(无尾段)也能正确重写成 /VisualdevShortLink。
        - id: jnpf-visualdev-shortlink
          uri: lb://jnpf-visualdev
          predicates:
            - Path=/api/visualdev/ShortLink/**
          filters:
            - RewritePath=/api/visualdev/ShortLink(?<segment>/?.*), /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