Користувацька аутентифікація є невід'ємною частиною більшості веб-додатків. Вона гарантує, що лише авторизовані користувачі можуть отримати доступ до певних частин вашого додатку, забезпечуючи безпечну взаємодію. Flask надає гнучкий та простий спосіб впровадження аутентифікації за допомогою розширень, таких як Flask-Login та Flask-WTF. У цій статті ми пройдемо весь процес налаштування аутентифікації користувачів у Flask.
Навіщо нам потрібна аутентифікація?
Аутентифікація важлива для:
- Забезпечення безпеки даних: Обмеження доступу до чутливої інформації.
- Персоналізація: Налаштування контенту або функціональності для конкретних користувачів.
- Відстеження: Моніторинг активності користувачів для аналітики або аудиту.
Огляд етапів
- Налаштування Flask та розширень.
- Створення моделей користувачів за допомогою SQLAlchemy.
- Налаштування реєстрації користувачів.
- Реалізація функціоналу для входу.
- Додавання функціоналу для виходу.
- Захист маршрутів за допомогою декораторів, які вимагають входу.
1. Налаштування середовища
Встановлення необхідних пакетів
Розпочнемо з встановлення необхідних залежностей:
pip install flask flask-login flask-wtf flask-sqlalchemy
Структура проекту
Ось рекомендована структура проекту:
flask_auth_app/
templates/
base.html
login.html
register.html
dashboard.html
static/
style.css
app.py
config.py
requirements.txt
2. Налаштування Flask
config.py
Налаштуйте конфігураційний файл для вашого додатку:
import os
class Config:
SECRET_KEY = os.environ.get('SECRET_KEY') or 'supersecretkey'
SQLALCHEMY_DATABASE_URI = 'sqlite:///site.db'
SQLALCHEMY_TRACK_MODIFICATIONS = False
3. Модель користувача
Налаштування бази даних
У файлі app.py
ініціалізуйте Flask, SQLAlchemy та Flask-Login:
from flask import Flask, render_template, redirect, url_for, flash, request
from flask_sqlalchemy import SQLAlchemy
from flask_login import LoginManager, UserMixin, login_user, logout_user, login_required, current_user
app = Flask(__name__)
app.config.from_object('config.Config')
db = SQLAlchemy(app)
login_manager = LoginManager(app)
login_manager.login_view = 'login'
login_manager.login_message_category = 'info'
Модель користувача
Створіть модель User
для обробки даних користувачів:
class User(UserMixin, db.Model):
id = db.Column(db.Integer, primary_key=True)
username = db.Column(db.String(20), unique=True, nullable=False)
email = db.Column(db.String(120), unique=True, nullable=False)
password = db.Column(db.String(60), nullable=False)
@login_manager.user_loader
def load_user(user_id):
return User.query.get(int(user_id))
UserMixin
: Додає необхідні методи для аутентифікації користувачів (is_authenticated
,is_active
тощо).load_user
: Отримує інформацію про користувача для керування сесіями.
4.
Реєстрація користувача
Форми
Створіть клас форми у файлі app.py
:
from flask_wtf import FlaskForm
from wtforms import StringField, PasswordField, SubmitField
from wtforms.validators import DataRequired, Length, Email, EqualTo, ValidationError
class RegistrationForm(FlaskForm):
username = StringField('Username', validators=[DataRequired(), Length(min=2, max=20)])
email = StringField('Email', validators=[DataRequired(), Email()])
password = PasswordField('Password', validators=[DataRequired()])
confirm_password = PasswordField('Confirm Password', validators=[DataRequired(), EqualTo('password')])
submit = SubmitField('Sign Up')
Маршрут для реєстрації
Додайте маршрут для обробки реєстрації користувачів:
@app.route('/register', methods=['GET', 'POST'])
def register():
form = RegistrationForm()
if form.validate_on_submit():
hashed_password = form.password.data # Хешуємо пароль тут (наприклад, за допомогою bcrypt)
user = User(username=form.username.data, email=form.email.data, password=hashed_password)
db.session.add(user)
db.session.commit()
flash('Ваш обліковий запис створено! Тепер ви можете увійти.', 'success')
return redirect(url_for('login'))
return render_template('register.html', form=form)
Шаблон для реєстрації
Створіть templates/register.html
:
{{ form.hidden_tag() }}
{{ form.username.label }} {{ form.username }}
{{ form.email.label }} {{ form.email }}
{{ form.password.label }} {{ form.password }}
{{ form.confirm_password.label }} {{ form.confirm_password }}
{{ form.submit() }}
5. Вхід користувача
Форма входу
Додайте форму входу:
class LoginForm(FlaskForm):
email = StringField('Email', validators=[DataRequired(), Email()])
password = PasswordField('Password', validators=[DataRequired()])
submit = SubmitField('Login')
Маршрут для входу
Обробіть функціонал входу:
@app.route('/login', methods=['GET', 'POST'])
def login():
form = LoginForm()
if form.validate_on_submit():
user = User.query.filter_by(email=form.email.data).first()
if user and user.password == form.password.data: # Порівнюємо хешовані паролі в реальних випадках
login_user(user)
flash('Ви успішно увійшли!', 'success')
return redirect(url_for('dashboard'))
else:
flash('Неуспішний вхід. Перевірте email та пароль.', 'danger')
return render_template('login.html', form=form)
Шаблон для входу
Створіть templates/login.html
:
{{ form.hidden_tag() }}
{{ form.email.label }} {{ form.email }}
{{ form.password.label }} {{ form.password }}
{{ form.submit() }}
6. Панель керування (захищений маршрут)
Додайте захищений маршрут:
@app.route('/dashboard')
@login_required
def dashboard():
return f"Привіт, {current_user.username}! Ласкаво просимо на вашу панель керування."
Вихід
Додайте маршрут для виходу:
@app.route('/logout')
def logout():
logout_user()
flash('Ви вийшли з системи.', 'info')
return redirect(url_for('login'))
7. Запуск додатку
- Ініціалізуйте базу даних:
flask shell >>> from app import db >>> db.create_all()
- Запустіть додаток:
flask run
- Перейдіть за такими URL-адресами:
/register
для створення облікового запису./login
для входу./dashboard
(доступний лише після входу).
8. Підвищення безпеки
- Хешування паролів: Використовуйте
bcrypt
абоwerkzeug.security
для хешування паролів.
pip install bcrypt
- Приклад:
from werkzeug.security import generate_password_hash, check_password_hash
hashed_password = generate_password_hash(password, method='sha256')
if check_password_hash(hashed_password, input_password): # Паролі співпали
2.
Захист від CSRF: Переконайтесь, що форми містять CSRF токени за допомогою form.hidden_tag()
.
Висновок
У цій статті ви дізналися:
- Як створити автентифікацію користувачів у Flask за допомогою Flask-Login.
- Як реалізувати реєстрацію, вхід і вихід користувачів.
- Як захистити маршрути за допомогою
@login_required
.
Автентифікація є важливим компонентом сучасних веб-застосунків. З Flask та Flask-Login ви можете легко створювати безпечні та зручні системи автентифікації для користувачів. У наступній статті ми розглянемо створення REST API з Flask. Слідкуйте за оновленнями! 🚀
Перекладено з: User Authentication in Flask: A Comprehensive Guide