from flask import jsonify from flask_login import current_user import functools def require_login(f): """登录用户权限验证装饰器(普通管理员和超级管理员都可以访问) 注意:对于API端点,不使用@login_required装饰器,因为它会重定向到登录页面 而不是返回JSON错误响应。我们直接检查认证状态并返回JSON。 """ @functools.wraps(f) def decorated_function(*args, **kwargs): # 检查用户是否已认证 # Flask-Login 的 current_user 在未登录时是一个 AnonymousUserMixin 实例 # 它的 is_authenticated 属性为 False if not hasattr(current_user, 'is_authenticated') or not current_user.is_authenticated: return jsonify({ 'success': False, 'message': '需要登录' }), 401 # 检查账号是否激活(is_active 是 Admin 模型的属性) if hasattr(current_user, 'is_active') and not current_user.is_active: return jsonify({ 'success': False, 'message': '账号已被禁用' }), 403 return f(*args, **kwargs) return decorated_function def require_admin(f): """超级管理员权限验证装饰器(只有超级管理员可以访问) 注意:对于API端点,不使用@login_required装饰器,因为它会重定向到登录页面 而不是返回JSON错误响应。我们直接检查认证状态并返回JSON。 """ @functools.wraps(f) def decorated_function(*args, **kwargs): # 检查用户是否已认证 if not hasattr(current_user, 'is_authenticated') or not current_user.is_authenticated: return jsonify({ 'success': False, 'message': '需要登录' }), 401 # 检查账号是否激活 if hasattr(current_user, 'is_active') and not current_user.is_active: return jsonify({ 'success': False, 'message': '账号已被禁用' }), 403 # 检查是否为超级管理员 if not hasattr(current_user, 'is_super_admin') or not current_user.is_super_admin(): return jsonify({ 'success': False, 'message': '需要超级管理员权限' }), 403 return f(*args, **kwargs) return decorated_function