- git 初始化 + .gitignore 补全(根 .env / logs / instance / __pycache__ 等) - 修复 utils/.gitignore 误将整个 utils/ 源码层忽略的问题,补入全部工具源码(含 ip2region.xdb) - 含后端全部代码:application / extensions / utils / config / migrations - 含前端 ui/(后续整体迁走) - 不含根 .env(含密钥,本地保留) Co-Authored-By: Claude <noreply@anthropic.com>
83 lines
3.4 KiB
Python
83 lines
3.4 KiB
Python
"""
|
|
认证与权限配置模块
|
|
=============================================================
|
|
|
|
包含 JWT 令牌、权限验证、登录白名单相关的所有配置项。
|
|
|
|
依赖:config/__init__.py 中的 _load_env_file() 已提前加载 .env
|
|
"""
|
|
|
|
import os
|
|
import logging
|
|
|
|
logger = logging.getLogger(__name__)
|
|
|
|
# ============================================================
|
|
# JWT令牌配置
|
|
# ============================================================
|
|
|
|
# JWT密钥(用于令牌签名和验证,必须保密)
|
|
# 从环境变量读取,未配置则拒绝启动,防止使用已知弱密钥
|
|
JWT_SALT = os.getenv('JWT_SALT', '')
|
|
|
|
# JWT令牌过期时间(分钟)
|
|
JWT_EXPIRE_MINUTES = int(os.getenv('JWT_EXPIRE_MINUTES', 20))
|
|
|
|
# 登录失败次数上限(同一IP+用户名连续失败超过此次数后锁定)
|
|
LOGIN_FAIL_MAX = int(os.getenv('LOGIN_FAIL_MAX', 5))
|
|
|
|
# 登录锁定时间(秒)(锁定期间禁止该IP+用户名登录)
|
|
LOGIN_LOCK_SECONDS = int(os.getenv('LOGIN_LOCK_SECONDS', 300))
|
|
|
|
# ============================================================
|
|
# 权限验证配置
|
|
# ============================================================
|
|
|
|
# 是否启用权限验证:True-启用(需要登录验证),False-禁用(所有请求放行)
|
|
PERMISSION_ENABLED = os.getenv('PERMISSION_ENABLED', 'True') == 'True'
|
|
|
|
# 系统内部调用的API密钥(用于定时任务等无用户场景)
|
|
# 调用方需在请求头中携带 X-Internal-API-Key 或 X-Scheduler-Key
|
|
INTERNAL_API_KEY = os.getenv('INTERNAL_API_KEY', '')
|
|
|
|
# 启动时校验:未配置则拒绝启动,防止定时任务权限验证失效
|
|
if not INTERNAL_API_KEY:
|
|
raise RuntimeError(
|
|
"INTERNAL_API_KEY 未配置!请在 .env 中设置内部调用密钥。\n"
|
|
"生成方式:python -c \"import secrets; print(secrets.token_urlsafe(32))\""
|
|
)
|
|
|
|
# 内部调用白名单IP(逗号分隔,支持通配符如 127.0.0.*)
|
|
# 在此列表中的IP发起的请求将跳过权限验证
|
|
INTERNAL_ALLOWED_IPS = os.getenv('INTERNAL_ALLOWED_IPS', '127.0.0.1')
|
|
|
|
# ============================================================
|
|
# 登录白名单配置(支持通配符)
|
|
# ============================================================
|
|
|
|
# 精确匹配白名单(逗号分隔,完全匹配路径才放行)
|
|
# 支持路径:/login、/captcha、/favicon.ico
|
|
LOGIN_WHITELIST_EXACT = os.getenv('LOGIN_WHITELIST_EXACT', '')
|
|
|
|
# 前缀匹配白名单(逗号分隔,路径以此开头即放行)
|
|
# 支持路径:/job/sendSms、/public、/static、/api/webhook
|
|
LOGIN_WHITELIST_PREFIX = os.getenv('LOGIN_WHITELIST_PREFIX', '')
|
|
|
|
# 通配符匹配白名单(逗号分隔,支持 * 和 ? 通配符)
|
|
# * 匹配任意多个字符,? 匹配单个字符
|
|
# 示例:/job/*/send* 可匹配 /job/1/sendSms、/job/2/sendEmail
|
|
LOGIN_WHITELIST_WILDCARD = os.getenv('LOGIN_WHITELIST_WILDCARD', '')
|
|
|
|
# 是否启用白名单调试日志:True-打印匹配日志,False-不打印
|
|
LOGIN_WHITELIST_DEBUG = os.getenv('LOGIN_WHITELIST_DEBUG', 'False') == 'True'
|
|
|
|
# 是否在白名单模式下记录访问日志:True-记录,False-不记录
|
|
LOGIN_WHITELIST_LOG_ACCESS = os.getenv('LOGIN_WHITELIST_LOG_ACCESS', 'False') == 'True'
|
|
|
|
# ============================================================
|
|
# 万能验证码(仅 DEMO 模式)
|
|
# ============================================================
|
|
|
|
# 万能验证码(仅在 FLASK_DEMO=True 时生效,生产环境必须为空)
|
|
CAPTCHA_BYPASS_CODE = os.getenv('CAPTCHA_BYPASS_CODE', '')
|