fix(security): 文件内联预览默认需登录,公开目录改为显式白名单

- file.public-preview 默认值由 true 改为 false(application.yml 与 @Value 同步),
  上传一律落在 /yyyyMMdd/ 日期目录,默认公开等于把所有上传文件(含盖章证明材料)
  变成匿名可读;公开页面引用的文件必须把所在目录列进 file.public-dirs
- 注释写清「公开页面引用的文件必须列进白名单,否则匿名访问会被拒」,同步更新
  FileAccessRules 类注释
- 删掉只被测试调用的 FileAccessRules.isPublicFileRequest(测试钉住的是没上线的
  平行判定);测试改为断言 downloadPatterns / permitAllPatterns /
  authenticatedPatterns 的内容与顺序
- 顺带把 gxmu.module-registry.strict 改成 ${GXMU_MODULE_REGISTRY_STRICT:true},
  与相邻配置一致

refs #58
This commit is contained in:
2026-11-03 23:14:13 +08:00
parent 43f0119b25
commit 6bfdae5787
3 changed files with 53 additions and 101 deletions
+11 -7
View File
@@ -92,12 +92,16 @@ config:
# 文件访问规则(spec #58)
# 下载接口 /api/file/download/** 永远需要登录,「取走原件」不再匿名。
#
# 确需公开的内联资源(预览 /api/file/<dir>/<name> 与缩略图 /api/file/thumbnail/**):
# 默认 true,否则公开页面的配图会整片变成需要 token;置 false 则内联也需登录。
# 内联预览(/api/file/<dir>/<name>)与缩略图(/api/file/thumbnail/**)默认也需要登录:
# 上传一律落在 /yyyyMMdd/ 日期目录,日期目录正好是两段路径,默认公开等于把所有上传文件
# (含盖章证明材料)变成匿名可读。因此默认值从 true 改成 false。
#
# 公开页面引用的文件必须把所在目录列进下面的 public-dirs 白名单,
# 否则匿名访问会被拒(401/403,表现为公开页面的空图)。
file:
public-preview: ${FILE_PUBLIC_PREVIEW:true}
# 额外公开目录(可选,逗号分隔,相对 /api/file):命中这些目录的原图与缩略图即使
# public-preview=false 也允许匿名读取。留空表示没有额外目录。
public-preview: ${FILE_PUBLIC_PREVIEW:false}
# 公开目录白名单(显式声明,逗号分隔,相对 /api/file):命中这些目录的原图与缩略图
# 允许匿名读取。留空表示没有任何公开目录——这是安全默认。
#
# 注意:当前上传一律落在 /yyyyMMdd/ 日期目录(见 FileStorageService.store),
# 目录本身不区分公开/私有;写日期目录等于把这些日期的全部文件公开,慎用。
@@ -221,9 +225,9 @@ gxmu:
allow-unknown-user: false
# 模块注册表(spec #58 / ADR 0006):启动期校验注册表 table_name 与 module 一致、
# 且注册表引用的业务表在库里存在,不一致直接启动失败(用户故事 21)。
# strict 默认 true;本地无库启动可临时设为 false 跳过校验。
# strict 默认 true;本地无库启动可临时设 GXMU_MODULE_REGISTRY_STRICT=false 跳过校验。
module-registry:
strict: true
strict: ${GXMU_MODULE_REGISTRY_STRICT:true}
openplat-sync:
enabled: true
# 每天 03:30