|
| 1 | +from flask import Flask, render_template, redirect, url_for, request, blueprints, flash |
| 2 | +from flask_login import LoginManager, UserMixin, login_user, login_required, logout_user, current_user |
| 3 | +from flask_sqlalchemy import SQLAlchemy |
| 4 | +from werkzeug.security import generate_password_hash, check_password_hash |
| 5 | + |
| 6 | +from src.config import app, db |
| 7 | +from src.models import User |
| 8 | + |
| 9 | +auth_bp = blueprints.Blueprint('auth', __name__) |
| 10 | + |
| 11 | +# Configure Flask-Login |
| 12 | +login_manager = LoginManager() |
| 13 | +login_manager.init_app(app) |
| 14 | +login_manager.login_view = 'login' |
| 15 | + |
| 16 | +# Define the User model |
| 17 | + |
| 18 | +@login_manager.user_loader |
| 19 | +def load_user(user_id): |
| 20 | + return User.query.get(int(user_id)) |
| 21 | + |
| 22 | +@app.route('/login', methods=['GET', 'POST']) |
| 23 | +def login(): |
| 24 | + if request.method == 'POST': |
| 25 | + username = request.form['username'] |
| 26 | + password = request.form['password'] |
| 27 | + user = User.query.filter_by(username=username).first() |
| 28 | + if user and check_password_hash(user.password, password): |
| 29 | + login_user(user) |
| 30 | + return redirect(url_for('dashboard')) |
| 31 | + flash('Invalid username or password') |
| 32 | + return render_template('login.html') |
| 33 | + |
| 34 | +@app.route('/signup', methods=['GET', 'POST']) |
| 35 | +def signup(): |
| 36 | + if request.method == 'POST': |
| 37 | + username = request.form['username'] |
| 38 | + password = request.form['password'] |
| 39 | + confirm_password = request.form['confirm_password'] |
| 40 | + |
| 41 | + if password != confirm_password: |
| 42 | + flash('Passwords do not match') |
| 43 | + return redirect(url_for('signup')) |
| 44 | + |
| 45 | + existing_user = User.query.filter_by(username=username).first() |
| 46 | + if existing_user: |
| 47 | + flash('Username already exists') |
| 48 | + return redirect(url_for('signup')) |
| 49 | + |
| 50 | + hashed_password = generate_password_hash(password) |
| 51 | + new_user = User(username=username, password=hashed_password) |
| 52 | + db.session.add(new_user) |
| 53 | + db.session.commit() |
| 54 | + flash('Account created successfully, please log in.') |
| 55 | + return redirect(url_for('login')) |
| 56 | + |
| 57 | + return render_template('signup.html') |
| 58 | + |
| 59 | +@app.route('/protected') |
| 60 | +@login_required |
| 61 | +def protected(): |
| 62 | + if current_user.user_level == 'admin': |
| 63 | + return f'Hello, Admin {current_user.username}! This is a protected page.' |
| 64 | + return f'Hello, {current_user.username}! This is a protected page.' |
| 65 | + |
| 66 | +@app.route('/logout') |
| 67 | +def logout(): |
| 68 | + logout_user() |
| 69 | + return redirect(url_for('login')) |
| 70 | + |
| 71 | + |
| 72 | +# def admin_required(f): |
| 73 | +# """Decorator to ensure the current user is an admin.""" |
| 74 | +# @wraps(f) |
| 75 | +# def decorated_function(*args, **kwargs): |
| 76 | +# if not current_user.is_authenticated or current_user.user_level != 'admin': |
| 77 | +# flash('Access denied. Admins only.') |
| 78 | +# return redirect(url_for('login')) |
| 79 | +# return f(*args, **kwargs) |
| 80 | +# return decorated_function |
| 81 | + |
| 82 | +# def user_required(f): |
| 83 | +# """Decorator to ensure the current user is a regular user.""" |
| 84 | +# @wraps(f) |
| 85 | +# def decorated_function(*args, **kwargs): |
| 86 | +# if not current_user.is_authenticated or current_user.user_level != 'user': |
| 87 | +# flash('Access denied. Users only.') |
| 88 | +# return redirect(url_for('login')) |
| 89 | +# return f(*args, **kwargs) |
| 90 | +# return decorated_function |
0 commit comments