Flask-Principal 是一个专为 Flask 应用设计的身份管理和权限控制扩展。它能够帮助开发者轻松实现用户身份验证和权限管理,从而提升应用的安全性和用户体验。该项目最初由 Ali Afshar 开发,现已成为 Pallets 社区生态系统的一部分,由社区共同维护。

1. 安装 Flask-Principal

首先,需要安装 Flask-Principal。可以通过以下命令安装:

 

pip install flask-principal
2. 基本配置

在 Flask 应用中配置 Flask-Principal,初始化扩展并定义权限

from flask import Flask
from flask_principal import Principal, Permission, RoleNeedapp = Flask(__name__)
app.secret_key = 'your_secret_key'  # 用于会话管理# 初始化 Flask-Principal
principals = Principal(app)# 定义权限
admin_permission = Permission(RoleNeed('admin'))
3. 定义用户模型

假设你已经有一个用户模型,用户模型中包含角色信息。例如:

class User(db.Model):id = db.Column(db.Integer, primary_key=True)username = db.Column(db.String(80), unique=True)roles = db.relationship('Role', secondary='user_roles')class Role(db.Model):id = db.Column(db.Integer, primary_key=True)name = db.Column(db.String(80), unique=True)class UserRole(db.Model):id = db.Column(db.Integer, primary_key=True)user_id = db.Column(db.Integer, db.ForeignKey('user.id'))role_id = db.Column(db.Integer, db.ForeignKey('role.id'))
4. 身份加载器

定义一个身份加载器,用于在用户登录时加载用户的角色和权限

 

from flask_login import current_user
from flask_principal import identity_loaded, RoleNeed, UserNeed@identity_loaded.connect_via(app)
def on_identity_loaded(sender, identity):# 设置当前用户对象identity.user = current_user# 添加用户 IDif hasattr(current_user, 'id'):identity.provides.add(UserNeed(current_user.id))# 添加用户角色if hasattr(current_user, 'roles'):for role in current_user.roles:identity.provides.add(RoleNeed(role.name))
5. 保护视图

使用 Permission 对象保护视图,确保只有具有相应权限的用户才能访问

 

@app.route('/admin')
@admin_permission.require(http_exception=403)
def admin_dashboard():return "Welcome to the admin dashboard!"

也可以使用上下文管理器来保护视图中的部分代码

 

@app.route('/articles')
def articles():with admin_permission.require():return "Only admins can see this"
6. 登录与注销

在用户登录时,发送身份更改信号

 

from flask_principal import Identity, identity_changed@app.route('/login', methods=['GET', 'POST'])
def login():# 假设有一个登录表单form = LoginForm()if form.validate_on_submit():user = User.query.filter_by(username=form.username.data).first()if user and user.check_password(form.password.data):login_user(user)identity_changed.send(app, identity=Identity(user.id))return redirect(url_for('admin_dashboard'))return render_template('login.html', form=form)

在用户注销时,清除身份信息

 

from flask_principal import AnonymousIdentity@app.route('/logout')
def logout():logout_user()for key in ('identity.name', 'identity.auth_type'):session.pop(key, None)identity_changed.send(app, identity=AnonymousIdentity())return redirect(url_for('login'))
7. 自定义权限

除了基于角色的权限,还可以定义更复杂的权限需求。例如,定义一个基于特定操作的权限

 

edit_permission = Permission(RoleNeed('editor'))@app.route('/edit_article')
@edit_permission.require(http_exception=403)
def edit_article():return "Only editors can edit articles"
8. 总结

Flask-Principal 提供了一种灵活的方式来实现基于角色和权限的访问控制。通过定义权限、加载用户身份和保护视图,可以轻松实现复杂的授权逻辑。结合 Flask-Login,可以实现完整的用户认证和授权系统。

希望这些信息能帮助你更好地使用 Flask-Principal!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/pingmian/90685.shtml
繁体地址,请注明出处:http://hk.pswp.cn/pingmian/90685.shtml
英文地址,请注明出处:http://en.pswp.cn/pingmian/90685.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

抖音与B站爬虫实战,获取核心数据

本文将深入讲解两大主流短视频平台(抖音、B站)的爬虫实战技术,提供可直接运行的代码解决方案,并分享突破反爬机制的核心技巧。一、平台特性与爬虫难点对比平台数据价值主要反爬措施推荐抓取方式抖音视频数据、用户画像、热榜签名验…

WSL切换网络模式

WSL切换网络模式问题WSL从NAT改成MIRRORED找到WSL Setting修改配置重启电脑(注意不是重启WSL)运行pio run验证IP问题 从鱼香ROS买了一个小鱼车,开始学习,然而装环境都要搞死我了。 垃圾VirtualBox我新买的电脑,装个Vi…

[Linux入门] Linux 远程访问及控制全解析:从入门到实战

目录 一、SSH 远程管理:为什么它是远程访问的首选? 1️⃣什么是 SSH? 2️⃣SSH 为什么比传统工具更安全? 3️⃣SSH 的 “三大组成部分” 4️⃣SSH 工作的 “五步流程” 5️⃣常用 SSH 工具 二、实战:构建 SSH 远…

n8n AI资讯聚合与分发自动化教程:从数据获取到微信与Notion集成

引言 n8n简介:自动化工作流利器 n8n是一款功能强大的开源自动化工具,采用独特的“公平代码”(Fair-Code)许可模式,旨在帮助用户连接各种应用程序和服务,从而实现工作流的自动化。它通过直观的可视化界面&am…

递归查询美国加速-技术演进与行业应用深度解析

在当今数据驱动的时代,递归查询已成为处理层级数据的核心技术,尤其在美国科技领域获得广泛应用。本文将深入解析递归查询在美国加速发展的关键因素,包括技术演进、行业应用场景以及性能优化策略,帮助读者全面理解这一重要技术趋势…

【AIGC专栏】WebUI实现图片的缩放

图片的缩放包含如下的各类不同的缩放模型。 Lanczos Lanczos重采样是一种数学上精确的方法,用于图像放大或缩小。它使用了一种称为 sinc 函数的数学公式,可以在保留图像细节的同时减少锯齿效应。 Nearest 最近邻插值是一种简单的图像放大方法,通过复制最近的像素值来填充新…

Libevent(4)之使用教程(3)配置

Libevent(4)之使用教程(3)配置事件 Author: Once Day Date: 2025年7月27日 一位热衷于Linux学习和开发的菜鸟,试图谱写一场冒险之旅,也许终点只是一场白日梦… 漫漫长路,有人对你微笑过嘛… 本文档翻译于:Fast portable non-bl…

若依前后端分离版学习笔记(三)——表结构介绍

前言: 这一节将ruoyi框架中数据库中的表结构过一遍,查看都有哪些表及其表结构及关联关系,为后续代码学习做准备。 一 代码生成表记录代码生成的业务表及相关字段1 代码生成业务表 CREATE TABLE gen_table (table_id bigint(20) NOT NULL AUTO…

NFS服务安装与使用

概述 内网需要使用NFS服务挂载到其他服务器,用做数据备份使用。 安装 # Centos yum install -y nfs-utils # Ubuntu apt install nfs-common配置 # 编辑 vim /etc/exports # 输入内容 /public/KOL-ESbackup 172.29.1.0/24 192.168.8.63 192.168.8.64 192.168.8.65(r…

使用adb 发送广播 动态改变app内的值

前言 在开发过程中有时候我们需要做一些调试工作。可以通过adb发送广播实现。 广播注册 注意最后一个参数,Context.RECEIVER_EXPORTED 这是Android 34以后强制要求的,方便外部发送这个广播。否则会报错val filter IntentFilter()filter.addAction("…

【Web安全】逻辑漏洞之URL跳转漏洞:原理、场景与防御

文章目录前言一、漏洞本质二、攻击原理正常跳转流程漏洞触发流程三、抓包的关键时机:跳转参数生成时四、风险场景1.登录/注册后跳转2.退出登录跳转3.分享/广告链接跳转4.密码重置链接跳转五、漏洞挖掘:怎么找到这种漏洞?1.找到跳转参数2.篡改…

新手开发 App,容易陷入哪些误区?

新手开发 App 时,常因对流程和用户需求理解不足陷入误区,不仅拖慢进度,还可能导致产品无人问津。​功能堆砌是最常见的陷阱。不少新手总想 “一步到位”,在初期版本就加入十几项功能,比如做社区团购 App 时&#xff0c…

Linux学习篇11——Linux软件包管理利器:RPM与YUM详解与实战指南,包含如何配置失效的YUM镜像地址

引言 本文主要梳理 Linux 系统中的软件包的概念,同时介绍RPM与YUM两大核心管理工具的常用指令、区别联系以及实战技巧等。本文作为作者学习Linux系统的第11篇文章,依旧旨在总结当前的学习内容,同时巩固知识以便日后的学习复习回顾。如有说的…

Vue3+ElementPlus实现可拖拽/吸附/搜索/收起展开的浮动菜单组件

在开发后台管理系统时,我们经常会用到浮动菜单来快速访问某些功能。本篇文章将分享一个基于 Vue3 ElementPlus 实现的浮动菜单组件,支持拖拽移动、边缘吸附、二级菜单展开、菜单搜索过滤、视频弹窗等交互效果,极大提升了用户操作的便捷性与美…

CSS 盒子模型学习版的理解

文章目录一、盒子模型构建流程(一句话抓关键)二、核心逻辑提炼三、代码验证四、一句话总结流程通过手绘图示,清晰拆解 Content(内容)→ Padding(内边距)→ Border(边框)→…

解决线程安全的几个方法

线程安全:线程安全问题的发现与解决-CSDN博客 Java中所使用的并发机制依赖于JVM的实现和CPU的指令。 所以了解并掌握深入Java并发编程基础的前提知识是熟悉JVM的实现了解CPU的指令。 1.volatile简介 在多线程并发编程中,有两个重要的关键字&#xff1a…

大模型应用班-第2课 DeepSeek使用与提示词工程课程重点 学习ollama 安装 用deepseek-r1:1.5b 分析PDF 内容

DeepSeek使用与提示词工程课程重点Homework:ollama 安装 用deepseek-r1:1.5b 分析PDF 内容python 代码建构:1.小模型 1.5b 可以在 笔记本上快速执行2.分析结果还不错3. 重点是提示词 prompt 的写法一、DeepSeek模型创新与特点1. DeepSeek-V3模型特点采用…

在FreeBSD系统下使用llama-cpp运行飞桨开源大模型Ernie4.5 0.3B(失败)

先上结论,截止到目前2025.7.25日,还不能用。也就是Ernie4.5模型无法在llama.cpp 和Ollama上进行推理,原因主要就llama是不支持Ernie4.5异构MoE架构。 不局限于FreeBSD系统,Windows也测试失败,理论上Ubuntu下也是不行。…

OpenCV图像梯度、边缘检测、轮廓绘制、凸包检测大合集

一、图像梯度 在图像处理中,「梯度(Gradient)」是一个非常基础但又极其重要的概念。它是图像边缘检测、特征提取、纹理分析等众多任务的核心。梯度的本质是在空间上描述像素灰度值变化的快慢和方向。 但我们如何在图像中计算梯度?…

GitHub 趋势日报 (2025年07月25日)

📊 由 TrendForge 系统生成 | 🌐 https://trendforge.devlive.org/ 🌐 本日报中的项目描述已自动翻译为中文 📈 今日获星趋势图 今日获星趋势图1814Resume-Matcher985neko714Qwen3-Coder622OpenBB542BillionMail486hrms219hyper…