[python][flask]Flask-Principal 使用詳解

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…