38 lines
1.2 KiB
Python
38 lines
1.2 KiB
Python
from functools import wraps
|
|
from flask import jsonify
|
|
from flask_jwt_extended import get_jwt_identity, verify_jwt_in_request
|
|
from app.extensions import db
|
|
from app.models.user import User
|
|
|
|
def get_current_user():
|
|
"""
|
|
Retorna o objeto User autenticado no JWT atual.
|
|
"""
|
|
try:
|
|
verify_jwt_in_request()
|
|
user_id = get_jwt_identity()
|
|
if not user_id:
|
|
return None
|
|
return db.session.get(User, user_id)
|
|
except Exception:
|
|
return None
|
|
|
|
def admin_required():
|
|
"""
|
|
Decorator que exige que o usuário autenticado tenha role == 'admin'.
|
|
Caso contrário, bloqueia com 403 Forbidden.
|
|
"""
|
|
def decorator(fn):
|
|
@wraps(fn)
|
|
def wrapper(*args, **kwargs):
|
|
verify_jwt_in_request()
|
|
user_id = get_jwt_identity()
|
|
user = db.session.get(User, user_id)
|
|
if not user or not user.ativo:
|
|
return jsonify({'error': 'Usuário inválido ou inativo.'}), 401
|
|
if user.role != 'admin':
|
|
return jsonify({'error': 'Acesso negado. Requer perfil de administrador.'}), 403
|
|
return fn(*args, **kwargs)
|
|
return wrapper
|
|
return decorator
|