Flask之用户认证与授权

用户认证与授权是构建安全 Web 应用程序的关键部分。下面,我们讲解如何使用 Flask-Login 实现用户认证,以及如何进行基本的权限管理。

📦 安装依赖

首先,确保你已经安装了 Flask-Login:

pip install Flask-Login

🏗️ 设置用户模型

假设我们已经有一个 User 模型,我们需要为其添加方法,以便与 Flask-Login 兼容。至少,我们需要实现以下方法:

  • is_authenticated
  • is_active
  • is_anonymous
  • get_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)或者权限的动态管理,可能需要进一步的设计和优化,希望这篇介绍能成为你开始的起点!🚀

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值