From 2a759d655db99e3061bc68228fdb6e81d88ecb5f Mon Sep 17 00:00:00 2001 From: bizwings Date: Tue, 1 Sep 2026 13:05:42 +0800 Subject: [PATCH] =?UTF-8?q?fix(BIZ-109):=20=E6=89=A9=E5=A4=A7=E4=B8=B4?= =?UTF-8?q?=E6=97=B6=E7=99=BD=E5=90=8D=E5=8D=95=E8=8C=83=E5=9B=B4=EF=BC=8C?= =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E5=88=98=E6=80=BB=E9=AA=8C=E6=94=B6=E4=BB=8D?= =?UTF-8?q?=E6=8A=A5=20401=20=E7=9A=84=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - v1 白名单仅覆盖 /api/records + /api/history 根路径,遗漏: * /api/records//preview(GET 子路径)→ 刘总报「预览未授权」 * /api/records//compare(GET 子路径)→ 刘总报「比对未授权」 * /api/download/(GET 子路径)→ 刘总报「下载未授权」 * /api/statistics(GET 根路径)→ 刘总报「统计分析不见」 * POST /api/generate(号码生成)→ 刘总报「号码生成未授权」 - v2 策略(按方法 + 路径前缀): * GET 类全部放行(含子路径):/api/records*, /api/history, /api/statistics, /api/download * POST /api/generate 放行(核心功能) * DELETE 类保留鉴权(防误删滥用) * 其他 POST 保留鉴权 - 验证:8 个接口全验证(5 个原 401 现 200,DELETE 仍 401) - 跟踪:BIZ-110 由 costcodev 适配前端后撤白名单 - 备份:app.py.bak.biz109.v1.20260901125959 - 闭环:2026-09-01 13:05 GMT+8 by 严维序 (opengineer) --- app.py | 48 +++++++++++++++++++++++++++++++++++++++--------- 1 file changed, 39 insertions(+), 9 deletions(-) diff --git a/app.py b/app.py index 37cf697..20e4e20 100644 --- a/app.py +++ b/app.py @@ -305,19 +305,49 @@ def find_draw_by_gen_time(gen_time): # ============================================================ # 认证装饰器(可选) # ============================================================ -# BIZ-109 临时放行白名单:仅 GET 只读接口临时放行鉴权(应急修复) -# 原因:BIZ-108 启用 auth_enabled 后,index.html 前端未适配 token 注入, -# 导致「记录」tab 完全不可用。临时放行只读接口恢复业务, -# BIZ-110 跟踪 index.html 适配后恢复鉴权。 -# 白名单接口:GET /api/records, GET /api/history -# 保留鉴权接口:所有 POST/DELETE/写接口 -AUTH_BYPASS_PATHS = {'/api/records', '/api/history'} +# BIZ-109 临时放行白名单 v2(v1 修复不彻底,用户验收仍报错,升级白名单) +# +# 原因:BIZ-108 commit 31cabbe 启用 auth_enabled=True,但 index.html 前端 +# api() 函数 (L944) 未注入 Authorization header。v1 白名单只覆盖 +# /api/records 和 /api/history 两个根路径,遗漏了子路径接口和 +# /api/statistics、/api/generate,导致刘总验收仍报「未授权访问」。 +# +# 升级策略(按方法 + 路径前缀): +# - GET 类全部放行(含子路径):/api/records, /api/records//preview, +# /api/records//compare, /api/history, /api/statistics, +# /api/download/ +# - POST /api/generate 放行:号码生成是核心功能,前端必须可调 +# - DELETE 类保留鉴权:保护用户生成记录不被误删(核心防滥用) +# - 其他 POST(如未来新增)保留鉴权 +# +# 跟踪:BIZ-110 由 costcodev 适配 index.html 前端后撤白名单,恢复完整鉴权。 +# 闭环:2026-09-01 12:59 GMT+8 by 严维序 (opengineer) + +# 路径前缀白名单(GET 类 + 写接口特例) +AUTH_BYPASS_GET_PREFIXES = ( + '/api/records', # 含子路径 preview/compare + '/api/history', + '/api/statistics', + '/api/download', +) +# 写接口特例白名单(精确路径) +AUTH_BYPASS_POST_EXACT = { + '/api/generate', # 号码生成(核心功能,前端必须可调) +} + +def _is_bypass(method, path): + """判断当前请求是否在 BIZ-109 临时白名单内。""" + if method == 'GET': + return any(path.startswith(p) for p in AUTH_BYPASS_GET_PREFIXES) + if method == 'POST': + return path in AUTH_BYPASS_POST_EXACT + return False def require_auth(f): @wraps(f) def decorated(*args, **kwargs): - # BIZ-109 应急:GET 只读接口临时放行 - if request.method == 'GET' and request.path in AUTH_BYPASS_PATHS: + # BIZ-109 应急:白名单内请求临时放行 + if _is_bypass(request.method, request.path): return f(*args, **kwargs) if CONFIG['auth_enabled']: token = request.headers.get('Authorization', '').replace('Bearer ', '')