ویژگی تصویر

مقدمه کوتاه درباره کتابخانه flask-login

  /  پایتون   /  کتابخانه flask-login در پایتون
بنر تبلیغاتی الف

کتابخانه Flask-Login یکی از افزونه‌های محبوب فریم‌ورک Flask برای مدیریت احراز هویت و کنترل جلسات کاربری است. این کتابخانه به شما کمک می‌کند تا ورود، خروج، نگهداری وضعیت ورود (session)، و محافظت از مسیرها با حداقل کدنویسی پیاده‌سازی شود. توجه کنید که Flask-Login تنها مسئول مدیریت جلسه (session) است و نگهداری اطلاعات کاربران یا رمزنگاری گذرواژه‌ها را انجام نمی‌دهد؛ این موارد باید توسط شما یا افزونه‌های دیگری مانند Flask-SQLAlchemy و Werkzeug مدیریت شوند.

ویژگی‌های اصلی

  • مدیریت وضعیت ورود کاربر (login/logout)
  • پشتیبانی از remember me با کوکی‌های امن
  • تزریق شیء کاربر به قالب و دسترسی از طریق current_user
  • محافظت از مسیرها با دکوراتور @login_required
  • سازگاری با هر نوع مدل کاربری که متدهای مورد نیاز را پیاده‌سازی کند

نصب و راه‌اندازی اولیه

pip install Flask-Login

این دستور کتابخانه را نصب می‌کند. در ادامه یک مثال پایه از راه‌اندازی Flask-Login با Flask-SQLAlchemy و UserMixin را می‌بینیم.

from flask import Flask, request, redirect, url_for, render_template
from flask_sqlalchemy import SQLAlchemy
from flask_login import LoginManager, UserMixin, login_user, logout_user, login_required, current_user

app = Flask(__name__)
app.config['SECRET_KEY'] = 'replace-with-secure-random'
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///users.db'
db = SQLAlchemy(app)

login_manager = LoginManager(app)
login_manager.login_view = 'login'

class User(UserMixin, db.Model):
    id = db.Column(db.Integer, primary_key=True)
    username = db.Column(db.String(150), unique=True)
    password_hash = db.Column(db.String(200))

@login_manager.user_loader
def load_user(user_id):
    return User.query.get(int(user_id))

توضیح: در این کد یک اپلیکیشن ساده ایجاد شده، پایگاه‌داده SQLite و یک مدل کاربری تعریف شده است. کلاس User از UserMixin ارث‌بری می‌کند تا متدهای مورد نیاز مثل is_authenticated و get_id را داشته باشد. تابع load_user مسئول بارگذاری کاربر از پایگاه‌داده هنگام هر درخواست است.

مثال ورود و خروج

@app.route('/login', methods=['GET', 'POST'])
def login():
    if request.method == 'POST':
        username = request.form['username']
        password = request.form['password']
        user = User.query.filter_by(username=username).first()
        if user and check_password_hash(user.password_hash, password):
            login_user(user, remember=('remember' in request.form))
            return redirect(url_for('protected'))
    return render_template('login.html')

@app.route('/logout')
@login_required
def logout():
    logout_user()
    return redirect(url_for('index'))

@app.route('/protected')
@login_required
def protected():
    return f"Hello, {current_user.username}!"

توضیح: این بلوک کد یک فرم ورود ساده را نشان می‌دهد. پس از تأیید اعتبار، از login_user برای علامت‌گذاری کاربر به عنوان واردشده استفاده می‌شود. دکوراتور @login_required تضمین می‌کند که تنها کاربران واردشده به مسیر محافظت‌شده دسترسی دارند. تابع logout_user کاربر را خارج می‌کند.

نکات امنیتی و بهینه‌سازی

  • هرگز گذرواژه‌ها را به‌صورت متن ساده ذخیره نکنید؛ از werkzeug.security.generate_password_hash و check_password_hash یا کتابخانه‌هایی مثل bcrypt استفاده کنید.
  • تنظیمات کوکی‌ها: SESSION_COOKIE_SECURE را در حالت تولید (production) فعال کنید تا کوکی‌ها فقط از طریق HTTPS منتقل شوند.
  • استفاده از CSRF protection (مثلاً Flask-WTF) برای فرم‌های ورود مهم است.
  • برای حفاظت بیش‌تر می‌توانید login_manager.session_protection را تنظیم کنید.

نمونه کد با هشینگ گذرواژه

from werkzeug.security import generate_password_hash, check_password_hash

# ایجاد کاربر
new_user = User(username='alice', password_hash=generate_password_hash('MyS3cret!'))

# هنگام لاگین
if user and check_password_hash(user.password_hash, password):
    login_user(user)

توضیح: استفاده از تابع generate_password_hash برای ذخیره امن گذرواژه و check_password_hash برای اعتبارسنجی به‌صورت امن توصیه می‌شود. این روش از حملات ساده مثل لو رفتن پایگاه‌داده جلوگیری نمی‌کند اما ریسک افشای گذرواژه‌ها را کاهش می‌دهد.

جدول توابع و متدهای مهم

تابع/ویژگیکارکرد
login_user(user, remember=False)ورود کاربر و نگهداری session؛ remember کوکی بلندمدت ایجاد می‌کند
logout_user()خروج کاربر از جلسه
current_userنماینده شیء کاربر در هر درخواست
@login_requiredدکوراتور برای محافظت از مسیرها
@login_manager.user_loaderتعریف تابع بارگذاری کاربر از session

اشکالات رایج و راه‌حل‌ها

  • مسئله: current_user همیشه AnonymousUserMixin است — دلیل معمول: فراموش کردن یا نادرست تعریف کردن user_loader.
  • مسئله: remember کار نمی‌کند — دلیل ممکن: تنظیم نادرست SECRET_KEY یا غیرفعال بودن cookie secure در محیط توسعه.
  • Flask-Login برای احراز هویت دو مرحله‌ای یا مدیریت مجوزها طراحی نشده — برای مدیریت سطوح دسترسی از رول‌ها یا افزونه‌هایی مثل Flask-Principal یا پیاده‌سازی دستی استفاده کنید.

راهنمای عملی برای تولید (Production)

  • SECRET_KEY قوی و تصادفی تنظیم کنید.
  • با استفاده از HTTPS و تنظیمات SESSION_COOKIE_SECURE و REMEMBER_COOKIE_HTTPONLY به امنیت کوکی‌ها توجه کنید.
  • از بانک اطلاعاتی امن و مکانیزم‌های rate limiting برای جلوگیری از حملات برودسفورس استفاده کنید.
  • لاگ‌گیری ورودهای ناموفق و فعال کردن مکانیزم قفل موقتی حساب پس از چند تلاش ناموفق.

جمع‌بندی و توصیه‌های نهایی

Flask-Login یک ابزار سبک و قدرتمند برای مدیریت جلسه و احراز هویت در اپلیکیشن‌های Flask است. این کتابخانه سرعت توسعه را افزایش می‌دهد، اما نکات امنیتی مثل هشینگ گذرواژه، استفاده از HTTPS و محافظت در برابر CSRF را بر عهده توسعه‌دهنده می‌گذارد. برای پروژه‌های پیچیده‌تر باید آن را با ابزارهای دیگر ترکیب کنید تا نیازمندی‌های احراز هویت و مجوزها به‌درستی پوشش داده شود.

آیا این مطلب برای شما مفید بود ؟

خیر
بله
موضوعات شما در انجمن: