1. 簡介
Flask-Login 是 Flask 的一個擴展,專門用于處理用戶認證相關的功能。它提供了用戶會話管理、登錄/注銷視圖、記住我功能等常見認證需求,讓開發者能夠快速實現安全的用戶認證系統。
2. 安裝與基礎配置
首先,需要安裝 Flask-Login:
pip install flask-login
然后在 Flask 應用中進行基礎配置:
from flask import Flask
from flask_login import LoginManagerapp = Flask(__name__)
app.secret_key = 'your_secret_key' # 用于加密會話數據,生產環境中應使用強密鑰# 初始化 LoginManager
login_manager = LoginManager()
login_manager.init_app(app)
login_manager.login_view = 'login' # 未登錄用戶重定向的登錄頁面路由
?
3. 用戶模型要求
Flask-Login 要求用戶模型實現以下幾個屬性和方法:
is_authenticated
:是否通過驗證is_active
:是否是活動用戶is_anonymous
:是否是匿名用戶get_id()
:返回用戶的唯一標識
可以通過繼承 UserMixin
來快速實現這些方法:
from flask_login import UserMixin
from flask_sqlalchemy import SQLAlchemydb = SQLAlchemy()class User(UserMixin, db.Model):id = db.Column(db.Integer, primary_key=True)username = db.Column(db.String(80), unique=True)password_hash = db.Column(db.String(128))def set_password(self, password):self.password_hash = generate_password_hash(password)def check_password(self, password):return check_password_hash(self.password_hash, password)
?
4. 用戶加載器
需要定義一個用戶加載函數,該函數接收用戶 ID 字符串,并返回對應的用戶對象:
@login_manager.user_loader
def load_user(user_id):return User.query.get(int(user_id))
?
5. 登錄與注銷功能
5.1 登錄視圖
在登錄視圖中,使用 login_user()
函數建立用戶會話:
from flask import request, redirect, url_for
from flask_login import login_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 user.check_password(password):login_user(user, remember=True) # remember 參數用于“記住我”功能return redirect(url_for('dashboard'))else:return 'Invalid credentials'return 'Login Form'
?
5.2 注銷視圖
在注銷視圖中,使用 logout_user()
清除用戶會話:
from flask_login import logout_user@app.route('/logout')
@login_required # 確保只有登錄用戶能訪問
def logout():logout_user()return redirect(url_for('login'))
?
6. 保護視圖與訪問控制
6.1 基本視圖保護
使用 @login_required
裝飾器限制只有登錄用戶能訪問:
from flask_login import login_required@app.route('/dashboard')
@login_required
def dashboard():return 'Welcome to the dashboard!'
?
6.2 基于角色的訪問控制
可以通過自定義裝飾器實現更細粒度的訪問控制:
from functools import wraps
from flask import abortdef role_required(role):def decorator(f):@wraps(f)def decorated_function(*args, **kwargs):if not current_user.is_authenticated or current_user.role != role:abort(403)return f(*args, **kwargs)return decorated_functionreturn decorator@app.route('/admin')
@login_required
@role_required('admin')
def admin_dashboard():return 'Welcome to the admin dashboard!'
?
7. 記住我功能
Flask-Login 的“記住我”功能默認已經啟用,由 login_user()
的 remember
參數控制。啟用后會在瀏覽器設置持久 cookie,即使關閉瀏覽器,用戶仍然保持登錄狀態。
8. 自定義未授權處理
可以通過自定義 unauthorized_callback
來處理未授權的請求:
@login_manager.unauthorized_handler
def unauthorized():return 'You must be logged in to view this page', 401
?
9. 用戶會話保護
Flask-Login 提供三種會話保護級別:
None
:禁用會話保護basic
(默認):記錄用戶代理和 IPstrong
:每次登錄生成新會話 ID,防止會話固定攻擊
login_manager.session_protection = 'strong'
?
10. 總結
Flask-Login 提供了以下核心功能:
簡潔的用戶模型接口:通過
UserMixin
快速實現所需方法。完整的會話管理:處理登錄、注銷和會話持久化。
視圖保護:通過裝飾器輕松限制訪問。
安全特性:包括密碼哈希、會話保護和 CSRF 防御。
靈活性:可以輕松集成到任何用戶存儲系統
在實際項目中使用 Flask-Login 時,建議:
始終使用 HTTPS 保護認證數據。
定期更新依賴庫以獲取安全修復。
對于復雜需求,可以結合 Flask-Principal 等擴展。
在生產環境中使用強密碼哈希算法(如 bcrypt)