【用户管理与权限 - 篇四】后端权限定义:模型与 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…