| """ |
| 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 |
|
|