修复后台弱密码提示误读本地配置问题

This commit is contained in:
liuwei
2026-05-06 08:46:11 +08:00
parent 8957799b76
commit 3730694465
2 changed files with 52 additions and 12 deletions

View File

@@ -54,18 +54,32 @@ def login():
return jsonify({"success": False, "error": error}), 429
return render_template('login.html', error=error)
# 优先使用数据库账号体系鉴权;若不可用则回退旧配置模式,保证兼容存量部署
# 优先使用数据库账号体系鉴权。
#
# 这里特意不再做“只要数据库校验失败就回退本地配置密码”的粗暴兜底,
# 原因有两点:
# 1. 一旦数据库里已经存在该管理员账号,真实口令状态应当以数据库为准;
# 2. 如果继续无条件回退本地 config.toml就会出现“数据库已改密但本地默认密码仍然生效”
# 的安全问题,也会让弱密码提示误判。
#
# 兼容策略调整为:
# - 数据库可用且账号存在:只认数据库;
# - 数据库不可用,或数据库里根本没有这个账号:才回退旧配置模式。
login_ok = False
db_account_exists = False
if admin_db:
try:
login_ok = admin_db.verify_admin_password(username, password)
db_account_exists = bool(admin_db.get_admin_by_username(username))
if db_account_exists:
login_ok = admin_db.verify_admin_password(username, password)
if login_ok:
admin_db.mark_login_success(username, request.remote_addr or "")
except Exception as e:
logger.error(f"数据库账号登录校验异常,回退配置模式: {e}")
login_ok = False
db_account_exists = False
if not login_ok:
if not login_ok and not db_account_exists:
login_ok = (username == server.username and password == server.password)
if login_ok:
@@ -107,11 +121,18 @@ def logout():
@login_required
def get_security_status():
"""返回当前登录管理员的安全状态。"""
server = current_app.dashboard_server
username = str(session.get("username", "") or "").strip()
# 安全状态这里改成“实时重算 + 回写 session”而不是只读登录瞬间写入的旧值
# 1. 避免管理员已经在数据库里改了密码,但当前会话仍保留旧的 force_password_change 标记;
# 2. 避免本地配置和数据库状态不一致时,前端一直弹出错误的弱密码提示。
force_password_change = bool(server.should_force_password_change(username)) if username else False
session["force_password_change"] = force_password_change
return jsonify({
"success": True,
"data": {
"force_password_change": bool(session.get("force_password_change", False)),
"session_timeout_minutes": int(current_app.dashboard_server.get_auth_policy().get("session_timeout_minutes", 480)),
"force_password_change": force_password_change,
"session_timeout_minutes": int(server.get_auth_policy().get("session_timeout_minutes", 480)),
}
})