Аутентифікація користувачів у Flask: Повний посібник

Користувацька аутентифікація є невід'ємною частиною більшості веб-додатків. Вона гарантує, що лише авторизовані користувачі можуть отримати доступ до певних частин вашого додатку, забезпечуючи безпечну взаємодію. Flask надає гнучкий та простий спосіб впровадження аутентифікації за допомогою розширень, таких як Flask-Login та Flask-WTF. У цій статті ми пройдемо весь процес налаштування аутентифікації користувачів у Flask.

Навіщо нам потрібна аутентифікація?

Аутентифікація важлива для:

  1. Забезпечення безпеки даних: Обмеження доступу до чутливої інформації.
  2. Персоналізація: Налаштування контенту або функціональності для конкретних користувачів.
  3. Відстеження: Моніторинг активності користувачів для аналітики або аудиту.

Огляд етапів

  1. Налаштування Flask та розширень.
  2. Створення моделей користувачів за допомогою SQLAlchemy.
  3. Налаштування реєстрації користувачів.
  4. Реалізація функціоналу для входу.
  5. Додавання функціоналу для виходу.
  6. Захист маршрутів за допомогою декораторів, які вимагають входу.

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. Запуск додатку

  1. Ініціалізуйте базу даних:
flask shell >>> from app import db >>> db.create_all() 
  1. Запустіть додаток:
flask run
  1. Перейдіть за такими URL-адресами:
    • /register для створення облікового запису.
    • /login для входу.
    • /dashboard (доступний лише після входу).

8. Підвищення безпеки

  1. Хешування паролів: Використовуйте bcrypt або werkzeug.security для хешування паролів.
pip install bcrypt 
  1. Приклад:
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

Leave a Reply

Your email address will not be published. Required fields are marked *