[python][flask]Flask-Login 使用详解
1. 简介
Flask-Login 是 Flask 的一个扩展,专门用于处理用户认证相关的功能。它提供了用户会话管理、登录/注销视图、记住我功能等常见认证需求,让开发者能够快速实现安全的用户认证系统。
2. 安装与基础配置
首先,需要安装 Flask-Login:
pip install flask-login
然后在 Flask 应用中进行基础配置:
from flask import Flaskfrom flask_login import LoginManagerapp = Flask(__name__)app.secret_key = \'your_secret_key\' # 用于加密会话数据,生产环境中应使用强密钥# 初始化 LoginManagerlogin_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 UserMixinfrom 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_loaderdef load_user(user_id): return User.query.get(int(user_id))
5. 登录与注销功能
5.1 登录视图
在登录视图中,使用 login_user() 函数建立用户会话:
from flask import request, redirect, url_forfrom 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_requireddef dashboard(): return \'Welcome to the dashboard!\'
6.2 基于角色的访问控制
可以通过自定义装饰器实现更细粒度的访问控制:
from functools import wrapsfrom 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_function return 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_handlerdef unauthorized(): return \'You must be logged in to view this page\', 401
9. 用户会话保护
Flask-Login 提供三种会话保护级别:
-
None:禁用会话保护 -
basic(默认):记录用户代理和 IP -
strong:每次登录生成新会话 ID,防止会话固定攻击
login_manager.session_protection = \'strong\'
10. 总结
Flask-Login 提供了以下核心功能:
-
简洁的用户模型接口:通过
UserMixin快速实现所需方法。 -
完整的会话管理:处理登录、注销和会话持久化。
-
视图保护:通过装饰器轻松限制访问。
-
安全特性:包括密码哈希、会话保护和 CSRF 防御。
-
灵活性:可以轻松集成到任何用户存储系统
在实际项目中使用 Flask-Login 时,建议:
-
始终使用 HTTPS 保护认证数据。
-
定期更新依赖库以获取安全修复。
-
对于复杂需求,可以结合 Flask-Principal 等扩展。
-
在生产环境中使用强密码哈希算法(如 bcrypt)


