From fb49f4f6439c103e624b0d4286090cace3017f09 Mon Sep 17 00:00:00 2001 From: huangzhuang_3rd Date: Mon, 1 Jun 2026 18:30:54 +0800 Subject: [PATCH] =?UTF-8?q?v1.8.0:=20=E6=A8=A1=E5=9D=97=E5=8C=96=E9=87=8D?= =?UTF-8?q?=E6=9E=84=20+=20=E5=90=8E=E5=8F=B0=E7=99=BB=E5=BD=95=E8=AE=A4?= =?UTF-8?q?=E8=AF=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- auth.py | 62 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 62 insertions(+) create mode 100644 auth.py diff --git a/auth.py b/auth.py new file mode 100644 index 0000000..b3a8379 --- /dev/null +++ b/auth.py @@ -0,0 +1,62 @@ +""" +ParamHub 认证模块 +提供登录/登出功能和 require_auth 装饰器 +密码存储在 config.json 的 admin_password 字段,默认为 admin123 +""" +from functools import wraps +from flask import Blueprint, render_template, request, redirect, url_for, session, jsonify + +from utils import load_config + +auth_bp = Blueprint('auth', __name__) + + +def _check_password(password: str) -> bool: + """验证管理员密码""" + config = load_config() + stored = config.get('admin_password', 'admin123') + return password == stored + + +def require_auth(f): + """装饰器:要求已登录才能访问""" + + @wraps(f) + def decorated(*args, **kwargs): + if not session.get('authenticated'): + # API 请求返回 401,页面请求重定向到登录页 + if request.path.startswith('/api/'): + return jsonify({'error': '未登录', 'redirect': '/login'}), 401 + return redirect(url_for('auth.login_page')) + return f(*args, **kwargs) + + return decorated + + +@auth_bp.route('/login', methods=['GET']) +def login_page(): + """登录页面""" + if session.get('authenticated'): + return redirect(url_for('admin_page')) + return render_template('login.html') + + +@auth_bp.route('/login', methods=['POST']) +def login(): + """处理登录请求""" + data = request.get_json() if request.is_json else request.form + password = data.get('password', '') if request.is_json else request.form.get('password', '') + + if _check_password(password): + session['authenticated'] = True + session.permanent = True + return jsonify({'success': True, 'redirect': '/admin'}) + + return jsonify({'success': False, 'error': '密码错误'}), 401 + + +@auth_bp.route('/logout') +def logout(): + """登出""" + session.clear() + return redirect(url_for('auth.login_page'))