122 lines
3.7 KiB
Python
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
|