Files
Quiz-for-Mont/app/utils/auth.py

68 lines
2.1 KiB
Python

from flask import redirect, url_for, flash
from flask_login import current_user
from functools import wraps
from werkzeug.security import generate_password_hash, check_password_hash
import os
from app.models import User
def admin_required(f):
@wraps(f)
def decorated(*args, **kwargs):
if not current_user.is_authenticated:
return redirect(url_for('login'))
if not getattr(current_user, 'is_admin', False):
flash('Недостаточно прав', 'danger')
return redirect(url_for('dashboard'))
return f(*args, **kwargs)
return decorated
def ensure_default_admin():
username = os.environ.get('ADMIN_USERNAME', 'ruslan')
password = os.environ.get('ADMIN_PASSWORD', '1234')
email = os.environ.get('ADMIN_EMAIL', 'ruslan@example.com')
user = User.get_or_none(User.username == username)
if user:
changed = False
if not user.is_admin:
user.is_admin = True
changed = True
try:
if not check_password_hash(user.password_hash, password):
user.password_hash = generate_password_hash(password)
changed = True
except Exception:
user.password_hash = generate_password_hash(password)
changed = True
if changed:
user.save()
else:
User.create(
username=username,
email=email,
full_name='Администратор',
password_hash=generate_password_hash(password),
is_admin=True
)
def ensure_test_users():
tests = [
('test1', 'test1@example.com', 'Пользователь 1'),
('test2', 'test2@example.com', 'Пользователь 2'),
]
for username, email, full_name in tests:
u = User.get_or_none(User.username == username)
if not u:
User.create(
username=username,
email=email,
full_name=full_name,
password_hash=generate_password_hash(os.environ.get('TEST_USER_PASSWORD', '1234')),
is_admin=False,
)