File size: 1,644 Bytes
5e5118b | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 | """
Authentication helper functions and decorators
"""
from functools import wraps
from flask import session, redirect, url_for, flash
from models import User
def login_required(f):
"""Decorator to require login for a route"""
@wraps(f)
def decorated_function(*args, **kwargs):
if 'user_id' not in session:
return redirect(url_for('login_page'))
user = User.query.get(session['user_id'])
if not user:
session.clear()
flash('Session expired. Please login again.', 'error')
return redirect(url_for('login_page'))
return f(*args, **kwargs)
return decorated_function
def role_required(role):
"""Decorator to require specific role for a route"""
def decorator(f):
@wraps(f)
def decorated_function(*args, **kwargs):
if 'user_id' not in session:
flash('Please login to access this page', 'error')
return redirect(url_for('login_page'))
user = User.query.get(session['user_id'])
if not user:
session.clear()
return redirect(url_for('login_page'))
if user.role != role:
flash(f'Access denied. This page is for {role}s only.', 'error')
return redirect(url_for('index'))
return f(*args, **kwargs)
return decorated_function
return decorator
def get_current_user():
"""Get currently logged in user"""
if 'user_id' in session:
return User.query.get(session['user_id'])
return None
|