parent
cc39f23efd
commit
6b0840b0c0
@ -0,0 +1,39 @@ |
|||||||
|
from functools import wraps |
||||||
|
from flask import request, jsonify |
||||||
|
from sqlalchemy import select |
||||||
|
from ..db.model import User, Session, db |
||||||
|
|
||||||
|
def requires_role(roles=[]): |
||||||
|
def decorator(f): |
||||||
|
@wraps(f) |
||||||
|
def decorated_function(*args, **kwargs): |
||||||
|
auth_header = request.headers.get('Authorization') |
||||||
|
if not auth_header: |
||||||
|
return jsonify({'error': 'No authorization header sent'}), 401 |
||||||
|
try: |
||||||
|
session_key = auth_header.split(' ')[1] |
||||||
|
except IndexError: |
||||||
|
return jsonify({'error': 'Invalid authorization header format'}), 401 |
||||||
|
|
||||||
|
session = db.session.execute( |
||||||
|
|
||||||
|
) |
||||||
|
if not session: |
||||||
|
return jsonify({'error': 'Invalid or expired session'}), 401 |
||||||
|
user = User.query.get(session.userID) |
||||||
|
if not user: |
||||||
|
return jsonify({'error': 'User not found'}), 401 |
||||||
|
|
||||||
|
# If no roles specified, allow access |
||||||
|
if not roles: |
||||||
|
return f(*args, **kwargs) |
||||||
|
|
||||||
|
# Check if user has any of the required roles |
||||||
|
if user.role in roles: |
||||||
|
return f(*args, **kwargs) |
||||||
|
|
||||||
|
return jsonify({'error': 'Insufficient permissions'}), 403 |
||||||
|
|
||||||
|
return decorated_function |
||||||
|
|
||||||
|
return decorator |
Loading…
Reference in new issue