аутентификация к веб админке

This commit is contained in:
vrubelroman 2025-11-23 02:36:15 +03:00
parent 595c9419f4
commit e6967db17d
6 changed files with 282 additions and 2 deletions

View file

@ -1,14 +1,29 @@
from flask import Flask, jsonify, render_template
from flask import Flask, jsonify, render_template, request, session, redirect, url_for
from flask_cors import CORS
import sqlite3
from datetime import datetime, date
from functools import wraps
import os
import auth_config
app = Flask(__name__)
# Secret key для сессий (в продакшене лучше использовать переменную окружения)
app.secret_key = os.environ.get('FLASK_SECRET_KEY', 'your-secret-key-change-in-production-please')
CORS(app)
# Путь к базе данных бота
DB_PATH = "/app/data/lichess_bot.db"
def login_required(f):
"""Декоратор для защиты роутов, требующих аутентификации"""
@wraps(f)
def decorated_function(*args, **kwargs):
if 'authenticated' not in session or not session['authenticated']:
return redirect(url_for('login'))
return f(*args, **kwargs)
return decorated_function
def get_message_counters_stats(db_path):
"""Get message counters statistics directly from database"""
try:
@ -97,12 +112,45 @@ def get_message_counters_stats(db_path):
'by_command': {}
}
@app.route('/login', methods=['GET', 'POST'])
def login():
"""Страница входа"""
if request.method == 'POST':
username = request.form.get('username', '').strip()
password = request.form.get('password', '')
if auth_config.validate_credentials(username, password):
session['authenticated'] = True
session['username'] = username
return redirect(url_for('index'))
else:
error_msg = 'Неверный логин или пароль'
return redirect(url_for('login', error=error_msg))
# GET запрос - показать форму логина
error = request.args.get('error', '')
# Если уже авторизован, перенаправляем на главную
if 'authenticated' in session and session.get('authenticated'):
return redirect(url_for('index'))
return render_template('login.html', error=error)
@app.route('/logout')
def logout():
"""Выход из системы"""
session.pop('authenticated', None)
session.pop('username', None)
return redirect(url_for('login'))
@app.route('/')
@login_required
def index():
"""Главная страница"""
return render_template('index.html')
@app.route('/api/users')
@login_required
def get_users():
"""Получить всех пользователей"""
try:
@ -217,6 +265,7 @@ def get_users():
}), 500
@app.route('/api/users/<int:user_id>/gamers')
@login_required
def get_user_gamers(user_id):
"""Получить игроков конкретного пользователя"""
try: