Django RBAC權限實戰全流程

基于 Django 內置權限體系(RBAC) 的簡單實戰案例。

我會從 建模、創建用戶、角色和權限、分配權限、接口校驗 全流程講解,既簡單又全面。


1?? 項目和應用初始化

pip install django djangorestframework 
django-admin startproject myproject
cd myproject
python manage.py startapp accounts

settings.py 中注冊應用:

INSTALLED_APPS = [...,'rest_framework','accounts','django.contrib.auth','django.contrib.contenttypes',
]

2?? 模型設計(用戶、文章示例)

Django 內置的 User 模型已經夠用,如果要擴展,可以繼承 AbstractUser

# accounts/models.py
from django.contrib.auth.models import AbstractUser
from django.db import modelsclass User(AbstractUser):# 可以添加自定義字段phone = models.CharField(max_length=20, blank=True, null=True)class Article(models.Model):title = models.CharField(max_length=255)content = models.TextField()author = models.ForeignKey(User, on_delete=models.CASCADE)class Meta:permissions = [("publish_article", "Can publish article"),("approve_article", "Can approve article"),]def __str__(self):return self.title
# accounts/serializers.py
from rest_framework import serializers
from accounts.models import Articleclass ArticleSerializer(serializers.ModelSerializer):class Meta:model = Articlefields = ['id', 'title', 'content', 'author']read_only_fields = ['author']  # 作者由系統自動指定

然后遷移:

python manage.py makemigrations
python manage.py migrate

在這里插入圖片描述


3?? 創建用戶、組(角色)和權限

在 Django shell 中操作:

python manage.py shell
from django.contrib.auth.models import User, Group, Permission
from accounts.models import Article
from django.contrib.contenttypes.models import ContentType# 創建用戶
alice = User.objects.create_user('alice', password='alice123')
bob = User.objects.create_user('bob', password='bob123')# 創建角色(組)
editor_group = Group.objects.create(name='Editor')
admin_group = Group.objects.create(name='Admin')# 給組分配權限
article_ct = ContentType.objects.get_for_model(Article)# Django 模型權限
add_article = Permission.objects.get(codename='add_article', content_type=article_ct)
change_article = Permission.objects.get(codename='change_article', content_type=article_ct)
delete_article = Permission.objects.get(codename='delete_article', content_type=article_ct)
view_article = Permission.objects.get(codename='view_article', content_type=article_ct)# 自定義權限
publish_article = Permission.objects.get(codename='publish_article', content_type=article_ct)# 分配權限給組
editor_group.permissions.add(add_article, change_article, view_article, publish_article)
admin_group.permissions.add(add_article, change_article, delete_article, view_article, publish_article)# 給用戶分配組
alice.groups.add(editor_group)
bob.groups.add(admin_group)

4?? 權限校驗示例

Django 提供 @permission_required 裝飾器和 user.has_perm() 方法。

視圖示例

# accounts/views.py
from rest_framework import viewsets
from rest_framework.permissions import IsAuthenticated, DjangoModelPermissions
from accounts.models import Article
from accounts.serializers import ArticleSerializer
from rest_framework.decorators import action
from rest_framework.response import Response
from rest_framework import statusclass ArticleViewSet(viewsets.ModelViewSet):"""提供文章的 CRUD 接口"""queryset = Article.objects.all()serializer_class = ArticleSerializerpermission_classes = [IsAuthenticated, DjangoModelPermissions]def perform_create(self, serializer):# 自動把當前用戶設置為作者serializer.save(author=self.request.user)@action(detail=True, methods=['post'], permission_classes=[IsAuthenticated, DjangoModelPermissions])def publish(self, request, pk=None):"""自定義動作:發布文章需要 'publish_article' 權限"""article = self.get_object()if not request.user.has_perm('accounts.publish_article'):return Response({"detail": "沒有權限發布文章"}, status=status.HTTP_403_FORBIDDEN)# 這里可以寫發布邏輯,例如設置 published=Truereturn Response({"detail": f"文章 '{article.title}' 已發布"})

5?? URL 配置

# accounts/urls.py
from django.urls import path, include
from rest_framework.routers import DefaultRouter
from .views import ArticleViewSetrouter = DefaultRouter()
router.register(r'articles', ArticleViewSet, basename='article')urlpatterns = [path('', include(router.urls)),
]

這樣就自動生成:

  • GET /articles/ → 列表

  • POST /articles/ → 創建

  • GET /articles/{id}/ → 詳情

  • PUT /PATCH /articles/{id}/ → 更新

  • DELETE /articles/{id}/ → 刪除

  • POST /articles/{id}/publish/ → 自定義發布動作

權限控制說明
DjangoModelPermissions:
自動映射 Django 模型權限到 DRF CRUD 操作:
GET → view_article
POST → add_article
PUT/PATCH → change_article
DELETE → delete_article
自定義動作 publish:
使用 has_perm(‘accounts.publish_article’) 校驗自定義權限。

myproject/urls.py 中 include:

path('accounts/', include('accounts.urls')),

6?? 核心流程總結

  1. 用戶 → 組(角色) → 權限

    • RBAC 模型,簡化管理。
  2. 模型級權限

    • Django 自動生成 add/change/delete/view 權限。
    • 可自定義權限,如 publish_article
  3. 授權校驗

    • @permission_requireduser.has_perm()
  4. 對象級權限擴展

    • 可以接入 django-guardian 或自定義 has_object_permission
用戶發起請求
是否登錄?
跳轉登錄
請求操作類型?
創建文章
修改文章
發布文章
用戶是否有 'add_article' 權限?
拒絕訪問
創建文章成功
用戶是否有 'change_article' 權限?
是否是文章作者?
修改文章成功
用戶是否有 'publish_article' 權限?
發布文章成功

? 這個案例展示了一個 完整的企業級權限管理最小可行方案

  • 用戶管理(創建、分配角色)
  • 角色管理(組 + 權限)
  • 權限管理(模型權限 + 自定義權限)
  • 訪問控制(視圖權限校驗)

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

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

相關文章

科學研究系統性思維的理論基礎:數字化研究工具

一、核心概念深度解析 1.1 數字化研究的本質轉變 數字化工具不僅是技術升級,更是科研范式的哲學重構。這種轉變在認識論層面體現為三個關鍵突破: 時空界限的崩塌 傳統研究受物理空間和實時性限制,而Google Colab等平臺實現了全球724小時協作。…

C# COM口串口調試助手實現

一、核心功能模塊設計 基礎通信功能 波特率自適應(支持9600-115200bps)數據格式配置(8N1/7E2等)流控支持(RTS/CTS硬件流控)接收/發送緩沖區管理(4KB2雙緩沖) 數據處理功能 HEX/ASCII…

模塊內聚類型有哪些

考題: 內聚類型是衡量模塊內部各元素之間聯系緊密程度的概念。其中,要求處理元素相關且按特定次序執行,屬于(__)。 A 時間內聚 B 順序內聚 C 過程內聚 D 邏輯內聚 一、什么是模塊內聚 模塊內聚反映的是模塊內部各組成部分之間的功能關聯程度,內聚越高,模塊的獨立性越好…

Selenium基礎操作

Selenium 基礎操作 作為一名資深爬蟲工程師,我將帶您全面掌握Selenium自動化測試與網頁爬取技術。 本教程基于Python 3.12,使用uv進行依賴管理,并通過FastAPI搭建模擬網站供實戰練習。 第一章:環境搭建 1.1 安裝Python 3.12 …

Gateway-路由-規則配置

1.路由 路由是指網絡設備(如路由器、交換機、或軟件)根據一張路徑表(路由表),為數據包選擇一條從源地址到目標地址的傳輸路徑的過程。它就像快遞配送系統,查看地址并決策下一步往哪里送”,該過…

BP神經網絡多輸入多輸出回歸預測+SHAP可解釋分析+新數據預測(MATLAB完整源碼)

該MATLAB代碼實現了一個基于前饋神經網絡的回歸預測模型,并結合SHAP(Shapley Additive exPlanations)值分析進行特征重要性評估。

【51單片機單按鍵控制2個LED循環閃爍】2022-12-7

緣由--CSDN問答 #include "reg52.h" sbit LED1P1^0; sbit LED2P1^5; sbit anjnP3^2; void main() {unsigned char H0,L0,Ys0;LED1LED20;while(1){if(anjn0&&Ys0){if(L>3)L0;while(anjn0);}if(L0)LED1LED20;//0表示亮1表示熄else if(L1){LED11;LED20;}else…

RustFS企業級高可用部署全指南:多活架構與跨數據中心實戰

作為一名深耕分布式存儲多年的架構師,我在金融、AI和物聯網領域多次成功落地RustFS高可用集群。本文將分享如何構建99.95%可用性的RustFS企業級部署方案,涵蓋從單數據中心到多活架構的全場景實踐。 一、高可用架構設計核心 RustFS的高可用性建立在分布式…

leetcode算法題記錄:

14、最長公共前綴編寫一個函數來查找字符串數組中的最長公共前綴。如果不存在公共前綴,返回空字符串 ""。示例 1:輸入:strs ["flower","flow","flight"] 輸出:"fl"示例 2&…

HarmonyOS 應用開發深入淺出:基于 Stage 模型與 ArkUI 的聲明式開發實踐

好的,請看這篇關于 HarmonyOS 應用開發中 Stage 模型與 ArkUI 聲明式開發實踐的技術文章。 HarmonyOS 應用開發深入淺出:基于 Stage 模型與 ArkUI 的聲明式開發實踐 引言 隨著 HarmonyOS 的不斷發展,其應用開發范式也經歷了重大的演進。從…

web服務解析案例

題目 模擬一個基于 DNS(域名系統)和 Nginx 的 Web 服務架構。 整體是模擬從用戶輸入域名,經 DNS 解析找到 Web 服務器,再由 Web 服務器(Nginx)提供內容的完整 Web 服務流程。 主機規劃主機名ip地址軟件說明…

揭示電解液與界面奧秘,理論計算賦能水系電池創新

揭示電解液與界面奧秘,理論計算賦能水系電池創新隨著全球對高安全、低成本儲能需求的激增,水系電池成為了下一代電池技術的重要候選者。然而,其性能瓶頸,如循環壽命、能量密度等,深深根植于復雜的電解液化學和電極-電解…

xv6實驗:Ubuntu2004 WSL2實驗環境配置(包括git clone網絡問題解決方法)

基本配置參考MIT6.S081 Ubuntu22.04 WSL2實驗環境配置,wsl安裝配置參考本欄的另一篇文章WSL2(ubuntu20.04)vscode聯合開發(附遷移方法) 如執行: git clone git://github.com/mit-pdos/xv6-riscv.git出現錯誤,或者無法clone情況,可以掛一個代理,然后按如…

reversed()方法

在 Python 中,reversed() 是一個內置函數,用于返回一個反向迭代器對象。這個函數可以處理多種序列類型的數據,如列表、元組、字符串、范圍對象等,通過它可以方便地實現序列元素的反向遍歷。下面從基本語法、適用對象、使用示例等方…

根據文本區域`textarea`的內容調整大小`field-sizing:content`

field-sizing:content 新屬性,可以讓 文本域textarea 根據輸入的內容自動調整大小, 無需使用javascript See the Pen 根據文本區域textarea的內容調整大小field-sizing:content by liu874396180 ( liu874396180) on CodePen.

Python3練習題

上一節中全面講解了基礎知識,為了鞏固知識點,當然最好的方法就是練習了。 練習 1:變量類型轉換與算術運算 需求:接收用戶輸入的兩個數字(可能是整數或字符串格式),轉換為浮點數后計算 “冪運算、…

Motioncam Color S + 藍激光:3D 視覺革新,重塑工業與科研應用新格局

在工業自動化、科研探索及智能檢測等前沿領域,對物體進行高精度、高速度且穩定可靠的三維成像,始終是推動技術進步與效率提升的關鍵訴求。過往的 3D 成像設備,常因精度欠佳、對復雜材質適應性差、難以應對動態場景等局限,在實際應…

用html5寫一個第一視角的摩托車開車游戲,畫上摩托車把手,把手兩側放上可操控方向的按鈕,再加上,前進和減速的按鈕

<!DOCTYPE html> <html lang"zh-CN"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>第一視角摩托車</title><style>html…

SpringMVC 系列博客(一):基礎概念與注解開發入門

目錄 一、引言 二、MVC 模式&#xff1a;SpringMVC 的設計基石 2.1 MVC 三大組件 2.2 主流 MVC 框架對比 2.3 MVC 模式的核心優勢 三、SpringMVC 框架&#xff1a;是什么&#xff1f;為什么學&#xff1f; 3.1 什么是 SpringMVC&#xff1f; 3.2 為什么要學 SpringMVC&a…

Java 字符串操作教程:三個任務完整復現與解析

這次是完成一些小任務來試試身手&#xff0c;免得生疏&#xff1a; 編寫程序&#xff0c;使用charAt和length方法&#xff0c;將字符串"HelloWorld"拆分為"Hello"和"World"兩個子串并輸出。 設計一個方法&#xff0c;利用indexOf和lastlndexOf&a…