基于 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…