From 3038cd038729579332792a47b035bb1930e0216b Mon Sep 17 00:00:00 2001 From: wanghanlin <1533525126@qq.com> Date: Wed, 26 Aug 2026 17:51:35 +0800 Subject: [PATCH] =?UTF-8?q?fix(security):=20CORS=20=E6=8B=86=E5=88=86?= =?UTF-8?q?=E4=B8=BA=20SDK=20=E5=BC=80=E6=94=BE=E4=B8=8E=E7=AE=A1=E7=90=86?= =?UTF-8?q?=E7=99=BD=E5=90=8D=E5=8D=95=E5=8F=8C=E8=BD=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 修复 9338fcb 收紧 CORS 白名单后引发的线上 403 回归: 将 corsConfigurationSource 与 addCorsMappings 拆分为两套配置——SDK 第三方接入接口 (/ai/**、/category/tree、/category/list、/feedback、/attachment/upload)开放 allowedOriginPatterns("*"), 管理后台接口保持 allowed-origins 白名单防 CSRF;并在 application-prod.yml 白名单补上线上域名 https://aidoc.dgscdw.com:11300,同时记录 CORS 双轨制踩坑规范。 --- CLAUDE.md | 15 ++++++++++ .../com/wok/supportbot/config/CorsConfig.java | 14 +++++++-- .../supportbot/security/SecurityConfig.java | 30 ++++++++++++++----- src/main/resources/application-prod.yml | 2 +- 4 files changed, 50 insertions(+), 11 deletions(-) diff --git a/CLAUDE.md b/CLAUDE.md index 68ad9c4..5e961eb 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -201,6 +201,21 @@ catch (e) { toast('操作失败', 'error') } **反面案例**: commit `527d9e7` 创建的流程图展示了 RAG 子图中 `VECTOR → RRF | KEYWORD → RRF | HYBRID → RRF → Reranker` 的三模式检索流程,但实际 `RagPipeline.similaritySearch()` 仅做纯向量检索,`HybridSearchService`/`RrfFusion`/`RerankerService` 尚未接入主对话流程,导致图表与代码事实不符。 +### 后端:CORS 双轨制(SDK 接口开放 / 管理接口白名单) + +**规则**: CORS 配置分两套,**不可整体收紧为单一白名单**(系统可用性第一): + +| 路径 | CORS 策略 | 原因 | +|------|----------|------| +| SDK 第三方接入接口:`/ai/**`、`/category/tree`、`/category/list`、`/feedback`、`/attachment/upload` | `allowedOriginPatterns("*")` 开放跨域 | 第三方域名动态未知,用 Bearer Token 鉴权,不依赖来源白名单 | +| 管理后台接口:其余 `/**` | `allowed-origins` 白名单 | 用 httpOnly refresh cookie,需白名单防跨域 CSRF | + +配置有两处,**必须同步修改**:`SecurityConfig.corsConfigurationSource()`(Security 链 CorsFilter)与 `CorsConfig.addCorsMappings()`(Spring MVC 层 CorsInterceptor)。两者均按注册顺序匹配,**先注册精确的 SDK 路径,再注册兜底的 `/**`**。 + +**反面案例**: commit `9338fcb` 为配合 refresh token 迁移 httpOnly Cookie,把 CORS 从 `allowedOriginPatterns("*")` 整体收紧为白名单,引发两个回归:(1) 同源静态资源 `