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