二十二、【用戶管理與權限 - 篇四】后端權限定義:模型與 API 實現

【用戶管理與權限 - 篇四】后端權限定義:模型與 API 實現

    • 前言
      • 準備工作
      • 第一部分:設計并創建 `Permission` 模型
      • 第二部分:更新 `Role` 模型以關聯 `Permission`
      • 第三部分:生成并應用數據庫遷移
      • 第四部分:創建 Serializers
      • 第五部分:創建 ViewSets
      • 第六部分:注冊 API 路由
      • 第七部分:通過數據遷移預置基礎權限數據
      • 第八部分:后端 API 初步測試
    • 總結

前言

在用戶管理與權限的前三篇文章中,我們已經成功搭建了用戶和角色的管理基礎,包括后端的模型、API 以及前端的用戶管理和角色管理界面。現在,是時候為我們的系統引入真正的“權限”概念了,這是實現細粒度訪問控制的核心。

本文將聚焦于后端權限的定義、模型設計以及相關的 API 實現,并確保我們有一些基礎的權限數據可供后續使用。我們將:

  1. 設計并創建一個 Permission (權限) 模型,用于定義系統中各種可操作的權限點。
  2. 更新 Role (角色) 模型,使其與 Permission 模型建立多對多關聯,從而實現“角色擁有某些權限”的邏輯。
  3. 創建相應的 Serializer 和 ViewSet,提供獲取所有權限點列表以及更新角色所擁有權限的 API。
  4. 通過數據遷移預置一些基礎的權限數據,為后續前端的權限分配界面和后端的權限校驗做好準備。

什么是權限點 (Permission)?

權限點通常代表系統中一個具體的操作或對某個資源的訪問許可。例如:

  • view_project (查看項目)
  • add_project (新建項目)
  • manage_users (管理用戶)

我們將這些權限點定義好后,就可以將它們分配給不同的角色,用戶通過繼承其角色的權限來獲得相應的操作能力。

準備工作

  1. Django 后端項目已就緒: 確保你的 test-platform/backend 項目結構完整,用戶和角色模型已創建。
  2. 數據庫遷移已同步。
  3. Postman 或其他 API 測試工具。
  4. 基礎模型 (BaseModel) 已定義 (假設包含 name, description, create_time, update_time 等通用字段)。

第一部分:設計并創建 Permission 模型

我們需要一個模型來存儲系統中的所有權限點。

  1. api/models.py 中定義 Permission 模型:
    在這里插入圖片描述

    # test-platform/api/models.py
    import uuid
    from django.db import models
    from django.contrib.auth.models import User
    # ... (User, Role, UserProfile 等模型定義保持不變) ...class Permission(BaseModel):"""權限模型存儲系統中的原子權限點。'name' 和 'description' 字段從 BaseModel 繼承。"""# 權限編碼/標識符,應該是唯一的,用于程序內部判斷# 例如: 'project:view_list', 'project:create', 'user:manage'code = models.CharField(max_length=100, unique=True, verbose_name="權限編碼")# 權限分組,方便管理,例如 "項目管理", "用戶管理"group = models.CharField(max_length=50, null=True, blank=True, verbose_name="權限分組")class Meta:verbose_name = "權限"verbose_name_plural = "權限列表"ordering = ['group', 'name']def __str__(self):group_prefix = f"{self.group}: " if self.group else ""return f"{group_prefix}{self.name} ({self.code})"
    

    代碼解釋:

    • code: 權限的唯一編碼,這是程序進行權限判斷時主要依據的字段。建議使用一種有層級或模塊化的命名方式,如 resource:action (例如 project:create)。
    • name: 權限的易讀名稱,用于在界面上展示給管理員 (繼承自 BaseModel)。
    • description: 權限的詳細描述 (繼承自 BaseModel)。
    • group: 用于對權限進行邏輯分組,方便在權限分配界面展示。

第二部分:更新 Role 模型以關聯 Permission

現在,我們需要修改 Role 模型,使其能夠擁有多個權限。

  1. api/models.py 中修改 Role 模型:
    在這里插入圖片描述

    # test-platform/api/models.py
    class Role(BaseModel):"""角色模型繼承自 BaseModel 以獲得 name, description, create_time, update_time 字段。"""permissions = models.ManyToManyField('Permission',  # 關聯到 Permission 模型blank=True, verbose_name="角色權限",related_name="roles" # 從 Permission 可以通過 .roles 反向查詢擁有該權限的角色)class Meta:verbose_name = "角色"verbose_name_plural = "角色列表"ordering = ['name']def __str__(self):return self.name
    

    關鍵變更:

    • permissions = models.ManyToManyField(Permission, ...): 在 Role 模型上添加了一個多對多字段,直接關聯到 Permission 模型。這意味著一個角色可以擁有多個權限,一個權限也可以被多個角色所擁有。

第三部分:生成并應用數據庫遷移

由于我們修改了 Role 模型并新增了 Permission 模型,需要進行數據庫遷移。

在終端中運行:

python manage.py makemigrations api
python manage.py migrate api 

在這里插入圖片描述

第四部分:創建 Serializers

我們需要為 Permission 模型創建一個 Serializer,并更新 RoleSerializer 以處理權限的關聯。

  1. 創建 PermissionSerializer (api/serializers.py):
    在這里插入圖片描述

    # test-platform/api/serializers.py
    from typing import List
    from rest_framework import serializers
    from django.contrib.auth.models import User
    from .models import Project, Module, TestCase, TestPlan, TestRun, TestCaseRun, Permission, Role, UserProfile, User # 確保導入 Permission
    # ... (其他 Serializer) ...class PermissionSerializer(serializers.ModelSerializer):class Meta:model = Permission# BaseModel 包含 name, description, create_time, update_time# 確保你的 BaseModel 確實有這些字段,或者在這里顯式定義fields = ['id', 'name', 'code', 'description', 'group', 'create_time', 'update_time'

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/910035.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/910035.shtml
英文地址,請注明出處:http://en.pswp.cn/news/910035.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

猜數字小游戲微信流量主小程序開源

這個智力小游戲采用了數字華容道的玩法,玩家需要通過移動數字方塊,將數字按順序排列完成游戲。代碼嚴格遵循微信小程序的目錄結構,包含以下部分: 完整的小程序配置文件(app.js、app.json、app.wxss) 游戲頁…

探秘阿里云EBS存儲:云計算的存儲基石

一、引言 在云計算時代,數據如同企業的生命線,數據存儲的重要性不言而喻。隨著企業數字化轉型的加速,海量數據的存儲與高效管理成為亟待解決的問題。云存儲以其卓越的靈活性、可擴展性和成本效益,逐漸成為眾多企業的首選方案。在…

音視頻之H.264的可伸縮編碼SVC

系列文章: 1、音視頻之視頻壓縮技術及數字視頻綜述 2、音視頻之視頻壓縮編碼的基本原理 3、音視頻之H.264/AVC編碼器原理 4、音視頻之H.264的句法和語義 5、音視頻之H.264/AVC解碼器的原理和實現 6、音視頻之H.264視頻編碼傳輸及其在移動通信中的應用 7、音視…

Anaconda安裝env,yml一直卡在Solving environment:不動

如果在使用conda env creat -f env.yml時候,anaconda一直卡住,如下 可以嘗試下面操作。 conda config --set solver libmamba # 使用libmamba引擎(Conda≥22.11) conda env create -f env.yaml # 重新嘗試

榕壹云婚戀相親系統:ThinkPHP+UniApp打造高效婚配平臺

引言 在數字化浪潮下,婚戀相親行業正加速向線上遷移。榕壹云公司基于市場需求與技術積累,開發一款功能完備、技術開源的婚戀相親小程序系統,為單身人士提供高效、安全的婚戀平臺。本文將圍繞系統背景、客戶定位、核心技術、功能模塊及優勢場景展開詳細解析,助力開發者與技…

查詢docker-compose 部署的milvus 請求日志

在 Docker Compose 部署的 Milvus 中,日志默認存儲在各個服務的容器內。以下是定位和查詢日志的方法: 1. 查看實時日志 使用 docker-compose logs 命令查看實時日志: bash # 查看所有服務的日志 docker-compose logs -f# 僅查看 Milvus 服務日志(服務名以 docker-compos…

Rsync實操

Rsync實操 一.rsync命令 #類似于cp[rootuser2 ~]# rsync info.sh root192.168.168.130:/rootroot192.168.168.130s password: [rootuser1 ~]# lsanaconda-ks.cfg ceph-release-1-1.el7.noarch.rpm info.sh 二、使用rsync備份push方式 服務器:server 192.168.168…

Java常見八股-(6.算法+實施篇)

Java常見八股-(1.Java基礎篇) Java常見八股-(2.Java高級篇) Java常見八股-(3.MySQL篇) Java常見八股-(4.前端篇) Java常見八股-(5.框架篇) 目錄 一、算…

阿里云部署的SMTP服務器安全攻防實錄:深度解析攻擊、防護與加固

阿里云部署的SMTP服務器安全攻防實錄:深度解析攻擊、防護與加固 一次針對云上SMTP服務的持續攻擊事件,揭示了郵件中繼服務面臨的多重安全挑戰。本文將深入剖析攻擊手法、防護策略與系統性加固方案。 某企業在阿里云上部署的Postfix SMTP服務器近期遭遇…

HTTP與HTTPS深度解析:從明文傳輸到安全通信的演進之路

引言 在互聯網的早期,HTTP(超文本傳輸協議)作為Web通信的基石,憑借簡單高效的特性推動了萬維網的爆發式增長。但隨著互聯網從“信息共享”向“價值交互”演進,HTTP的明文傳輸特性逐漸暴露致命缺陷——用戶的每一次點擊…

滲透實戰:繞過沙箱機制的反射型XSS

Lab 24&#xff1a;利用 xss 繞過 csrf 防御 依然是留言板的問題可以執行<h1>標簽 進入修改郵箱的界面&#xff0c;修改抓包 這里構造修改郵箱的代碼 <script> var req new XMLHttpRequest(); req.onload handleResponse; req.open(get,/my-account,true); req…

K8S篇之利用deployment實現滾動平滑升級

一、更新策略 在 Kubernetes (K8s) 中,滾動平滑升級(Rolling Update)是一種無縫更新部署的方式,允許你在不中斷服務的情況下逐步更新應用程序。這是 Kubernetes 默認的 Deployment 更新策略,它會按照指定的步幅逐步替換 Pods,確保在新版本的應用程序沒有完全替換舊版本的…

【Dify 案例】【MCP實戰】【一】【前置配置】

MCP(Model Context Protocol,模型上下文協議) ,2024年11月底,由Anthropic 推出的一種開放標準。旨在為大語言模型(LLM)提供統一的、標準化方式與外部數據源和工具之間進行通信。 MCP 作為一種標準化協議,極大地簡化了大語言模型與外部世界的交互方式,使開發者能夠以統…

2025高考志愿填報張雪峰資料合集

2025高考志愿填報課程&#xff0c;張雪峰專業指導&#xff01;包含61節課&#xff0c;93個專業詳解&#xff0c;總計1500分鐘視頻。 獨家各省資料包&#xff01;新舊高考政策全覆蓋&#xff0c;適合高三家長和考生。內容整理自互聯網&#xff0c;無償分享&#xff0c;如有侵權&…

Nginx+Tomcat負載均衡群集

一.案例:部署Tomcat 1.案例分析 1.1案例概述 京北點指科技有限公司發布V3版移聯建站管理系統&#xff0c;該項目為Java 語言開發的Web 站點。目前&#xff0c;IBM 的 WebSphere 及 0racle 的 WebLogic 占據了市面上 Java 語言 Web 站點的大部分份額。這兩種軟件以其無與倫比…

華為云Flexus+DeepSeek征文|基于華為云一鍵部署dify平臺構建合同審核助手應用實踐

目錄 前言 1 華為云一鍵部署Dify平臺 1.1 華為云Dify平臺介紹 1.2 部署過程介紹 1.3 登錄Dify平臺 2 接入華為云 ModelArts Studio 的 DeepSeek 大模型 2.1 獲取調用模型服務信息 2.2 在 Dify 中配置模型 3 構建合同審核助手應用 3.1 簡要介紹合同審核助手 3.2 開始…

三種經典算法無人機三維路徑規劃對比(SMA、HHO、GWO三種算法),Matlab代碼實現

代碼功能 該MATLAB代碼用于對比三種元啟發式優化算法&#xff08;SMA、HHO、GWO三種算法&#xff0c; SMA黏菌算法、HHO哈里斯鷹優化算法、GWO灰狼優化算法&#xff09; 在特定優化問題上的性能&#xff0c;運行環境MATLABR2020b或更高 &#xff1a; 初始化問題模型&#xff…

設計模式精講 Day 8:組合模式(Composite Pattern)

【設計模式精講 Day 8】組合模式&#xff08;Composite Pattern&#xff09; 開篇 在“設計模式精講”系列的第8天&#xff0c;我們將深入講解組合模式&#xff08;Composite Pattern&#xff09;。組合模式是一種結構型設計模式&#xff0c;它允許將對象組合成樹形結構以表示…

【Dify學習筆記】:RagFlow接入Dify基礎教程

RagFlow接入Dify基礎教程 如果RagFlow還沒部署&#xff0c;可參考我另一篇本地部署文章&#xff1a;【Dify學習筆記】&#xff1a;本地部署RagFlow適配Dify 一、RagFlow 1. 配置模型 點擊&#xff1a;頭像 > Model providers 添加模型供應商、設置默認模型Set default …

Apache ECharts-02.入門案例

一.入門案例 官網下載&#xff1a;下載 - Apache ECharts&#xff0c;下載echarts.js文件&#xff0c;下載好后在其同一個文件夾下創建html文件即可。 <!DOCTYPE html> <html><head><meta charset"utf-8" /><title>ECharts</title…