用户认证与授权是构建安全 Web 应用程序的关键部分。下面,我们讲解如何使用 Flask-Login 实现用户认证,以及如何进行基本的权限管理。
📦 安装依赖
首先,确保你已经安装了 Flask-Login:
pip install Flask-Login
🏗️ 设置用户模型
假设我们已经有一个 User 模型,我们需要为其添加方法,以便与 Flask-Login 兼容。至少,我们需要实现以下方法:
is_authenticatedis_activeis_anonymousget_id
对于这个示例,我们假设用户名是唯一的,并用它作为用户的 ID:
from flask_login import UserMixin
class User(db.Model, UserMixin):
id = db.Column(db.Integer, primary_key=True)
username = db.Column(db.String(80), unique=True, nullable=False)
email = db.Column(db.String(120), unique=True, nullable=False)
password_hash = db.Column(db.String(128)) # 假设为用户存储密码散列
def __repr__(self):
return f'<User {self.username}>'
这里,我们还假设用户表中保留了一个存储密码 hash 的字段,大部分情况下使用工具如 werkzeug.security 进行密码 hash 和验证。
🔑 初始化 Flask-Login
在你的 Flask 应用初始化中,设置 Flask-Login。
from flask import Flask
from flask_sqlalchemy import SQLAlchemy
from flask_login import LoginManager
app = Flask(__name__)
app.config['SECRET_KEY'] = 'supersecretkey' # 用于保护用户会话免受篡改
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///mydatabase.db'
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False
db = SQLAlchemy(app)
login_manager = LoginManager()
login_manager.init_app(app)
login_manager.login_view = 'login' # 设置登录视图以便未登录用户重定向
@login_manager.user_loader
def load_user(user_id):
return User.query.get(int(user_id))
👤 用户登录视图
创建登录视图,在这里我们验证用户提供的凭证,并登录用户:
from flask import render_template, redirect, url_for, request, flash
from flask_login import login_user, login_required, logout_user
from werkzeug.security import check_password_hash
@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)
flash('登录成功!', 'success')
return redirect(url_for('dashboard')) # 登录后跳转到用户主页
flash('无效的用户名或密码', 'danger')
return render_template('login.html')
@app.route('/dashboard')
@login_required
def dashboard():
return '欢迎来到您的个人控制面板!🏠'
@app.route('/logout')
@login_required
def logout():
logout_user()
flash('成功注销!', 'success')
return redirect(url_for('login'))
🔒 权限管理
权限管理是关于限制用户对特定功能或部分资源的访问。可以通过为用户模型添加角色字段来实现基本的权限管理。
首先,修改用户模型以包含角色信息:
class User(db.Model, UserMixin):
# ...
role = db.Column(db.String(50), nullable=False, default='user') # 默认角色为普通用户
在视图中,可以根据用户角色进行权限检查:
from functools import wraps
def role_required(role):
def decorator(f):
@wraps(f)
def decorated_function(*args, **kwargs):
if not current_user.is_authenticated or current_user.role != role:
flash('您无权访问此页面。', 'warning')
return redirect(url_for('index'))
return f(*args, **kwargs)
return decorated_function
return decorator
@app.route('/admin')
@login_required
@role_required('admin')
def admin_dashboard():
return '欢迎,管理员!🔑'
结语
这就是一个简单却功能齐全的用户认证与授权实施方案!通过 Flask-Login 以及角色管理,你可以搭建一个安全、专业的用户管理系统。根据需要,你可以扩展此系统,例如将角色和权限分为更细的粒度,或者将权限配置移到配置文件或数据库中。
如遇到更多复杂的场景,比如基于角色的访问控制(RBAC)或者权限的动态管理,可能需要进一步的设计和优化,希望这篇介绍能成为你开始的起点!🚀

227

被折叠的 条评论
为什么被折叠?



