Arch/middleware/auth_middleware.py

122 lines
3.7 KiB
Python

from functools import wraps
from flask import request, redirect, url_for, flash, current_app
from flask_login import current_user
def login_required_api(f):
"""
Decorador para verificar autenticación en endpoints de API.
A diferencia del decorador estándar de Flask-Login, este devuelve
una respuesta JSON en lugar de redirigir.
Args:
f: Función a decorar
Returns:
function: Función decorada
"""
@wraps(f)
def decorated_function(*args, **kwargs):
if not current_user.is_authenticated:
return {
'success': False,
'message': 'Autenticación requerida',
'code': 401
}, 401
return f(*args, **kwargs)
return decorated_function
def check_permission(required_level):
"""
Decorador para verificar nivel de permisos en endpoints de API.
Args:
required_level (int): Nivel mínimo requerido
Returns:
function: Decorador configurado
"""
def decorator(f):
@wraps(f)
def decorated_function(*args, **kwargs):
if not current_user.is_authenticated:
return {
'success': False,
'message': 'Autenticación requerida',
'code': 401
}, 401
if not current_user.has_permission(required_level):
return {
'success': False,
'message': 'No tiene permisos suficientes para esta acción',
'code': 403
}, 403
return f(*args, **kwargs)
return decorated_function
return decorator
def check_active_user(f):
"""
Decorador para verificar que el usuario está activo y no ha expirado.
Args:
f: Función a decorar
Returns:
function: Función decorada
"""
@wraps(f)
def decorated_function(*args, **kwargs):
if not current_user.is_authenticated:
return redirect(url_for('auth.login'))
if not current_user.is_active():
flash('Su cuenta está desactivada. Contacte al administrador.', 'danger')
return redirect(url_for('auth.logout'))
if current_user.is_expired():
flash('Su cuenta ha expirado. Contacte al administrador.', 'danger')
return redirect(url_for('auth.logout'))
return f(*args, **kwargs)
return decorated_function
def log_activity(activity_type):
"""
Decorador para registrar actividad del usuario.
Args:
activity_type (str): Tipo de actividad a registrar
Returns:
function: Decorador configurado
"""
def decorator(f):
@wraps(f)
def decorated_function(*args, **kwargs):
# Ejecutar la función original
result = f(*args, **kwargs)
# Registrar actividad si el usuario está autenticado
if current_user.is_authenticated:
from utils.logger import log_user_activity
# Extraer información relevante
user_id = current_user.id
ip_address = request.remote_addr
user_agent = request.user_agent.string
# Registrar actividad
log_user_activity(
user_id=user_id,
activity_type=activity_type,
ip_address=ip_address,
user_agent=user_agent,
details=kwargs
)
return result
return decorated_function
return decorator