修复后台弱密码提示误读本地配置问题
This commit is contained in:
@@ -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)),
|
||||
}
|
||||
})
|
||||
|
||||
|
||||
Reference in New Issue
Block a user