From e0c95a9facc4a2b41df16a987c8fdc0883b67dee Mon Sep 17 00:00:00 2001 From: opengineer Date: Wed, 2 Sep 2026 17:51:21 +0800 Subject: [PATCH] =?UTF-8?q?fix(BIZ-109):=20=E6=92=A4=E5=9B=9E=20v2=20?= =?UTF-8?q?=E4=B8=B4=E6=97=B6=E7=99=BD=E5=90=8D=E5=8D=95=EF=BC=88BIZ-110?= =?UTF-8?q?=20=E5=89=8D=E7=AB=AF=E9=89=B4=E6=9D=83=E5=B7=B2=E5=B0=B1?= =?UTF-8?q?=E7=BB=AA=EF=BC=8C=E6=81=A2=E5=A4=8D=E4=B8=A5=E6=A0=BC=E9=89=B4?= =?UTF-8?q?=E6=9D=83=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 删除 AUTH_BYPASS_GET_PREFIXES / AUTH_BYPASS_POST_EXACT 配置项 - 删除 _is_bypass() 函数 - require_auth 中间件恢复严格鉴权逻辑(依赖 Bearer token) - 前端 BIZ-110 commit dcc7339 已完成 localStorage + login 浮层 + Bearer 注入 - 回滚保险:app.py.bak.biz110.revoked.20260902(本地保留,未入库) Refs: BIZ-109, BIZ-110 Op: opengineer @ 2026-09-02 17:50 GMT+8 --- app.py | 47 +++++------------------------------------------ 1 file changed, 5 insertions(+), 42 deletions(-) diff --git a/app.py b/app.py index 20e4e20..1d47c8b 100644 --- a/app.py +++ b/app.py @@ -303,52 +303,15 @@ def find_draw_by_gen_time(gen_time): return None, 'error' # ============================================================ -# 认证装饰器(可选) +# 认证装饰器(严格鉴权 — BIZ-110 闭环后恢复) # ============================================================ -# 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 - +# 2026-09-02 by 严维序 (opengineer) +# BIZ-110 前端鉴权适配完成后,撤回 BIZ-109 临时白名单(AUTH_BYPASS_* / _is_bypass)。 +# index.html 前端 api() 函数已自动注入 'Authorization: Bearer ', +# 401 时清 localStorage + 跳登录页,鉴权闭环恢复。 def require_auth(f): @wraps(f) def decorated(*args, **kwargs): - # BIZ-109 应急:白名单内请求临时放行 - if _is_bypass(request.method, request.path): - return f(*args, **kwargs) if CONFIG['auth_enabled']: token = request.headers.get('Authorization', '').replace('Bearer ', '') if token != CONFIG['api_token']: