کتابخانه 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 را بر عهده توسعهدهنده میگذارد. برای پروژههای پیچیدهتر باید آن را با ابزارهای دیگر ترکیب کنید تا نیازمندیهای احراز هویت و مجوزها بهدرستی پوشش داده شود.
آیا این مطلب برای شما مفید بود ؟




