当前位置: 首页 > article >正文

【Dv3Admin】工具权限配置文件解析

接口级权限控制是后台系统安全防护的核心手段。基于用户角色、请求路径与方法进行细粒度授权,可以有效隔离不同用户的数据访问范围,防止越权操作,保障系统整体稳定性。

本文解析 dvadmin/utils/permission.py 模块,重点关注其在匿名用户拦截、超级管理员放行、普通管理员控制以及动态接口权限校验中的具体实现,探讨模块结构设计与应用边界。

文章目录

  • permission.py
  • 项目源码解析
  • 应用案例
  • 总结

permission.py

系统基于 Django 和 DRF 构建后台 API 服务,dvadmin/utils/permission.py 模块提供了自定义权限控制机制。针对不同用户身份(匿名用户、超级管理员、普通管理员、自定义角色权限)分别实现了独立的权限校验类。模块通过匹配接口路径和请求方法判断用户是否有访问权限,强化了后端接口的安全防护。

项目特点描述
技术栈Django + DRF 自定义权限体系
功能定位接口级权限控制、角色权限校验、匿名访问控制
验证方式请求地址 + 请求方法双重校验
白名单机制支持接口白名单,无需角色授权即可访问

dvadmin/utils/permission.py 文件定义了多种权限校验策略,覆盖了匿名用户拒绝、超级管理员全通、普通管理员通行、基于角色接口权限控制等多种场景。自定义的 CustomPermission 类根据接口地址与请求方式匹配用户拥有的接口权限列表,并支持接口白名单放行,确保访问控制灵活可控。同时辅助函数如 ValidationApiReUUID 提供接口动态校验支持,增强对 RESTful 风格接口的兼容性。

模块职责说明
匿名用户权限拦截AnonymousUserPermission 限制未登录用户访问接口
超级管理员通行SuperuserPermission 赋予超级管理员无条件访问所有接口权限
普通管理员通行AdminPermission 赋予管理角色基本权限
基于接口权限控制CustomPermission 根据接口地址和请求方法判断是否有权限访问
接口路径动态匹配支持替换 URL 中的动态参数(如 {id})支持正则匹配
接口白名单机制允许配置无需授权即可访问的接口,提升接口开放性和灵活性

在需要精细化控制 API 访问权限的后台系统中,dvadmin/utils/permission.py 提供的权限体系可以灵活应用于不同模块。适用于登录鉴权、角色授权控制、匿名用户拦截、接口白名单管理等场景,有效保证系统接口安全性,同时支持多角色、多接口、多方法的细粒度权限分配。

使用场景说明
后台接口统一权限校验不同角色用户访问接口时自动判断是否有权限
限制匿名访问未登录用户尝试访问受限接口时自动拒绝
超级管理员快速通行超级管理员无需逐一配置权限,默认拥有全部访问权限
动态 URL 接口权限校验适配 RESTful 动态接口路径如 /user/{id}/edit/
配置系统公共接口白名单登录、注册等接口无需授权也可访问,提升用户体验

项目源码解析

接口权限校验工具函数

用于正则匹配当前请求接口与已有权限接口模板,判断是否拥有访问权限。接口模板中 {id} 部分动态替换成正则表达式,支持灵活的接口路径验证。属于基础工具函数,可在多种权限控制场景下复用。

def ValidationApi(reqApi, validApi):if validApi is not None:valid_api = validApi.replace('{id}', '.*?')matchObj = re.match(valid_api, reqApi, re.M | re.I)if matchObj:return Trueelse:return Falseelse:return False

匿名用户权限验证类

阻止未登录的匿名用户访问需要认证的接口。判断请求用户是否为 AnonymousUser 类型,若是则拒绝访问。主要用于保护需要登录才能访问的系统模块。

class AnonymousUserPermission(BasePermission):def has_permission(self, request, view):if isinstance(request.user, AnonymousUser):return Falsereturn True

超级管理员权限验证类

允许系统中的超级管理员无条件访问所有接口。通过 request.user.is_superuser 判断用户身份,快速放行,降低权限控制开销。

class SuperuserPermission(BasePermission):def has_permission(self, request, view):if isinstance(request.user, AnonymousUser):return Falseif request.user.is_superuser:return True

管理员权限验证类

允许具有管理员角色标记或超级管理员身份的用户访问接口。综合角色属性 admin 字段判断权限,适合细粒度区分系统普通用户与管理员的使用场景。

class AdminPermission(BasePermission):def has_permission(self, request, view):if isinstance(request.user, AnonymousUser):return Falseis_superuser = request.user.is_superuseris_admin = request.user.role.values_list('admin', flat=True)if is_superuser or True in is_admin:return True

用于在接口权限匹配中,将动态的 UUID 字段统一替换成正则表达式,保证路径格式标准化,提升接口匹配的准确性。主要服务于接口动态参数场景下的权限验证。

def ReUUID(api):pattern = re.compile(r'[a-f\d]{4}(?:[a-f\d]{4}-){4}[a-f\d]{12}/$')m = pattern.search(api)if m:res = api.replace(m.group(0), ".*/")return reselse:return None

自定义综合权限验证类

系统核心权限控制模块,综合判断接口白名单、角色绑定按钮接口权限,决定请求是否放行。支持动态参数路径处理、请求方法校验、多角色权限叠加,具有较高灵活性和扩展性。依赖 ApiWhiteList 表管理无需授权的接口,RoleMenuButtonPermission 表管理角色拥有的接口权限,是接口级权限控制的重要组成部分。

class CustomPermission(BasePermission):def has_permission(self, request, view):if isinstance(request.user, AnonymousUser):return Falseif request.user.is_superuser:return Trueelse:api = request.pathmethod = request.methodmethodList = ['GET', 'POST', 'PUT', 'DELETE', 'OPTIONS', 'PATCH']method = methodList.index(method)api_white_list = ApiWhiteList.objects.values(permission__api=F('url'), permission__method=F('method'))api_white_list = [str(item.get('permission__api').replace('{id}', '([a-zA-Z0-9-]+)')) + ":" + str(item.get('permission__method')) + '$'for item in api_white_list if item.get('permission__api')]if not hasattr(request.user, "role"):return Falserole_id_list = request.user.role.values_list('id', flat=True)userApiList = RoleMenuButtonPermission.objects.filter(role__in=role_id_list).values(permission__api=F('menu_button__api'), permission__method=F('menu_button__method'))ApiList = [str(item.get('permission__api').replace('{id}', '([a-zA-Z0-9-]+)')) + ":" + str(item.get('permission__method')) + '$'for item in userApiList if item.get('permission__api')]new_api_list = api_white_list + ApiListnew_api = api + ":" + str(method)for item in new_api_list:matchObj = re.match(item, new_api, re.M | re.I)if matchObj:return Trueelse:return False

应用案例

接口级权限控制在后台管理系统中的实际应用

在后台管理系统中,接口级权限控制是保障系统安全性和操作权限合规性的核心手段。dvadmin/utils/permission.py 模块通过自定义权限类,灵活处理不同角色和请求路径的权限校验,实现了从匿名用户拦截、超级管理员放行、普通管理员控制到基于角色的动态权限校验的多层级安全防护。模块支持路径参数的动态匹配,并能够与接口白名单机制结合,提供灵活的接口访问策略。

匹配成功
匹配失败
请求用户身份识别
是否为匿名用户?
返回无权限错误
是否为超级管理员?
放行
查询角色绑定接口权限
构建接口路径+方法标识符
与权限表中接口路径模板进行正则匹配

在实际应用中,系统会根据不同用户身份类型(如普通用户、管理员、超级管理员)自动匹配权限控制策略,避免越权操作,确保系统的数据隔离性和权限合规性。

权限校验与接口放行的业务实现

在后台系统中,当用户尝试访问某个受保护的接口时,系统会根据当前用户的角色、请求路径和方法动态判断是否允许访问。例如,假设用户尝试访问 GET /api/users/ 接口,系统会通过 CustomPermission 类的逻辑检查用户的角色是否拥有访问该接口的权限:

class CustomPermission(BasePermission):def has_permission(self, request, view):if isinstance(request.user, AnonymousUser):return Falseif request.user.is_superuser:return Trueelse:api = request.pathmethod = request.methodmethodList = ['GET', 'POST', 'PUT', 'DELETE', 'OPTIONS', 'PATCH']method = methodList.index(method)api_white_list = ApiWhiteList.objects.values(permission__api=F('url'), permission__method=F('method'))api_white_list = [str(item.get('permission__api').replace('{id}', '([a-zA-Z0-9-]+)')) + ":" + str(item.get('permission__method')) + '$'for item in api_white_list if item.get('permission__api')]if not hasattr(request.user, "role"):return Falserole_id_list = request.user.role.values_list('id', flat=True)userApiList = RoleMenuButtonPermission.objects.filter(role__in=role_id_list).values(permission__api=F('menu_button__api'), permission__method=F('menu_button__method'))ApiList = [str(item.get('permission__api').replace('{id}', '([a-zA-Z0-9-]+)')) + ":" + str(item.get('permission__method')) + '$'for item in userApiList if item.get('permission__api')]new_api_list = api_white_list + ApiListnew_api = api + ":" + str(method)for item in new_api_list:matchObj = re.match(item, new_api, re.M | re.I)if matchObj:return Trueelse:return False

在该例中,CustomPermission 会首先检查用户是否是匿名用户,如果是,则拒绝访问;若用户为超级管理员,直接放行;对于普通用户,则会根据用户角色绑定的接口权限列表,判断是否匹配当前请求的路径和方法。如果接口不在白名单中且用户没有足够权限,访问会被拒绝。

超级管理员权限快速放行

超级管理员身份在系统中拥有完全的访问权限,模块通过以下逻辑快速判断超级管理员身份并放行所有请求,避免每次权限检查时都进行繁琐的权限验证:

class SuperuserPermission(BasePermission):def has_permission(self, request, view):if isinstance(request.user, AnonymousUser):return Falseif request.user.is_superuser:return True

这样,超级管理员可以在不需要额外配置的情况下,访问系统中所有的 API 接口,无论接口是否有权限配置。

角色权限校验与动态接口控制

在更复杂的业务场景中,不同角色可能拥有不同的权限,例如某些用户只能访问特定的数据。AdminPermission 类允许管理角色的用户访问接口,具体通过用户的角色和权限数据进行判断:

class AdminPermission(BasePermission):def has_permission(self, request, view):if isinstance(request.user, AnonymousUser):return Falseis_superuser = request.user.is_superuseris_admin = request.user.role.values_list('admin', flat=True)if is_superuser or True in is_admin:return True

该权限检查不仅考虑了用户是否是管理员,还通过角色的 admin 字段进一步验证是否具有访问该接口的权限,保证权限的细粒度控制。

接口白名单机制

在一些特殊场景下,部分接口不需要进行权限验证,常见的如登录、注册、验证码发送等。这些接口可以配置到白名单中,通过 ApiWhiteList 表管理,无需额外的权限控制。每次请求到达时,系统会检查当前接口是否属于白名单接口,如果是,则自动放行:

api_white_list = ApiWhiteList.objects.values(permission__api=F('url'), permission__method=F('method'))

此机制大大简化了接口权限配置,避免了频繁修改权限逻辑的麻烦,同时提升了系统的可扩展性。

通过以上实现,dvadmin/utils/permission.py 模块提供了灵活、细粒度的权限控制机制,适用于不同角色、接口、请求方法的权限校验,且能够与动态路径、白名单机制结合,确保系统的安全性与可扩展性。

总结

模块以路径加请求方法为权限校验依据,结合角色与白名单机制,覆盖绝大多数后台接口访问控制需求。采用自定义权限类,配合动态 URL 匹配和接口正则替换,实现灵活兼容 RESTful 风格。整体结构清晰,具备较高的可扩展性与通用性。

权限匹配采用循环遍历方式,效率在接口量大时存在隐患。白名单与权限列表加载未作缓存处理,增加数据库压力。权限判断逻辑集中在单一类中,缺乏更细粒度的职责划分,后期维护和扩展难度较高。

相关文章:

【Dv3Admin】工具权限配置文件解析

接口级权限控制是后台系统安全防护的核心手段。基于用户角色、请求路径与方法进行细粒度授权,可以有效隔离不同用户的数据访问范围,防止越权操作,保障系统整体稳定性。 本文解析 dvadmin/utils/permission.py 模块,重点关注其在匿…...

AI炼丹日志-22 - MCP 自动操作 Figma+Cursor 自动设计原型

MCP 基本介绍 官方地址: https://modelcontextprotocol.io/introduction “MCP 是一种开放协议,旨在标准化应用程序向大型语言模型(LLM)提供上下文的方式。可以把 MCP 想象成 AI 应用程序的 USB-C 接口。就像 USB-C 提供了一种…...

Python爬虫:AutoScraper 库详细使用大全(一个智能、自动、轻量级的网络爬虫)

更多内容请见: 爬虫和逆向教程-专栏介绍和目录 文章目录 一、AutoScraper概述1.1 AutoScraper介绍1.2 安装1.3 注意事项二、基本使用方法2.1 创建 AutoScraper 实例2.2 训练模型2.3 保存和加载模型2.4 数据提取方法2.5 自定义规则三、高级功能3.1 多规则抓取3.2 分页抓取3.3 代…...

2025.6.1总结

今天又上了一天课,假期三天,上了两天的课,明天还得刷题。利用假期时间上课学习,并没有让我感到有多充实,反而让我感到有些小压抑。 在下午的好消息分享环节,我分享了毕业工作以来的一些迷茫。我不知道自己…...

[嵌入式实验]实验四:串口打印电压及温度

一、实验目的 熟悉开发环境在开发板上读取电压和温度信息使用串口和PC通信在PC上输出当前电压和温度信息 二、实验环境 硬件:STM32开发板、CMSIS-DAP调试工具 软件:STM32CubeMX软件、ARM的IDE:Keil C51 三、实验内容 配置相关硬件设施 &…...

LVS+Keepalived 高可用

目录 一、核心概念 1. LVS(Linux Virtual Server) 2. Keepalived 二、高可用架构设计 1. 架构拓扑图 2. 工作流程 三、部署步骤(以 DR 模式为例) 1. 环境准备 2. 主 LVS 节点配置 (1)安装 Keepali…...

Linux正则三剑客篇

一、历史命令 history 命令 :用于输出历史上使用过的命令行数量及具体命令。通过 history 可以快速查看并回顾之前执行过的命令,方便重复操作或追溯执行过程。 !行号 :通过指定历史命令的行号来重新执行该行号对应的命令。例如,若…...

HTML5 视频播放器:从基础到进阶的实现指南

在现代Web开发中,视频播放功能是许多网站的重要组成部分。无论是在线教育平台、视频分享网站,还是企业官网,HTML5视频播放器都扮演着不可或缺的角色。本文将从基础到进阶,详细介绍如何实现一个功能完善的HTML5视频播放器&#xff…...

鸿蒙HarmonyOS (React Native)的实战教程

一、环境配置 ‌安装鸿蒙专属模板‌ bashCopy Code npx react-native0.72.5 init HarmonyApp --template react-native-template-harmony:ml-citation{ref"4,6" data"citationList"} ‌配置 ArkTS 模块路径‌ 在 entry/src/main/ets 目录下创建原生模块&…...

函数栈帧深度解析:从寄存器操作看函数调用机制

文章目录 一、程序运行的 "舞台":内存栈区与核心寄存器二、寄存器在函数调用中的核心作用​三、函数调用全流程解析:以 main 调用 func 为例阶段 1:main 函数栈帧初始化**阶段 2:参数压栈(右→左顺序&#x…...

【计算机网络】第3章:传输层—可靠数据传输的原理

目录 一、PPT 二、总结 (一)可靠数据传输原理 关键机制 1. 序号机制 (Sequence Numbers) 2. 确认机制 (Acknowledgements - ACKs) 3. 重传机制 (Retransmission) 4. 校验和 (Checksum) 5. 流量控制 (Flow Control) 协议实现的核心:滑…...

rv1126b sdk移植

DDR rkbin bin/rv11/rv1126bp_ddr_v1.00.bin v1.00 板子2 reboot异常 [ 90.334976] reboot:Restarting system DDR 950804cb85 wesley.yao 25/04/02-15:54:40,fwver: v1.00In Derate1 tREFI1x SR93 PD13 R ddrconf 4 rgef0 rgcsb0 1 ERR: Read gate CS0 err error ERR …...

第6节 Node.js 回调函数

Node.js 异步编程的直接体现就是回调。 异步编程依托于回调来实现,但不能说使用了回调后程序就异步化了。 回调函数在完成任务后就会被调用,Node 使用了大量的回调函数,Node 所有 API 都支持回调函数。 例如,我们可以一边读取文…...

OpenCV CUDA模块直方图计算------在 GPU上执行直方图均衡化(Histogram Equalization)函数equalizeHist

操作系统:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 编程语言:C11 算法描述 cv::cuda::equalizeHist 用于增强图像的对比度,通过将图像的灰度直方图重新分布,使得图像整体对比度更加明显。 这在医学…...

构建系统maven

1 前言 说真的,我是真的不想看构建了,因为真的太多了。又多又乱。Maven、Gradle、Make、CMake、Meson、Ninja,Android BP。。。感觉学不完,根本学不完。。。 但是没办法最近又要用一下Maven,所以咬着牙再简单整理一下…...

day13 leetcode-hot100-23(链表2)

206. 反转链表 - 力扣(LeetCode) 1.迭代 思路 这个题目很简单,最主要的就是了解链表的数据结构。 链表由多个节点构成,每个节点包括值与指针,其中指针指向下一个节点(单链表)。 方法就是将指…...

Java面试八股(Java基础,Spring,SpringBoot篇)

java基础 JDK,JRE,JVMJava语言的特点Java常见的运行时异常Java为什么要封装​自增自减的隐式转换移位运算符1. 左移运算符&#xff08;<<&#xff09;2. 带符号右移运算符&#xff08;>>&#xff09;3. 无符号右移运算符&#xff08;>>>&#xff09; 可变…...

Python编程基础(二)| 列表简介

引言&#xff1a;很久没有写 Python 了&#xff0c;有一点生疏。这是学习《Python 编程&#xff1a;从入门到实践&#xff08;第3版&#xff09;》的课后练习记录&#xff0c;主要目的是快速回顾基础知识。 练习1&#xff1a; 姓名 将一些朋友的姓名存储在一个列表中&#xf…...

支持向量机(SVM):解锁数据分类与回归的强大工具

在机器学习的世界中&#xff0c;支持向量机&#xff08;Support Vector Machine&#xff0c;简称 SVM&#xff09;一直以其强大的分类和回归能力而备受关注。本文将深入探讨 SVM 的核心功能&#xff0c;以及它如何在各种实际问题中发挥作用。 一、SVM 是什么&#xff1f; 支持…...

代谢组数据分析(二十五):代谢组与蛋白质组数据分析的异同

禁止商业或二改转载,仅供自学使用,侵权必究,如需截取部分内容请后台联系作者! 文章目录 介绍蛋白质组定义与基因的关系蛋白质组学(Proteomics)检测技术蛋白质的鉴定与定量分析蛋白质“鉴定”怎么做蛋白质“定量”怎么做蛋白质鉴定与定量对比应用领域代谢组定义代谢组学(M…...

002 flutter基础 初始文件讲解(1)

在学习flutter的时候&#xff0c;要有“万物皆widget”的思想&#xff0c;这样有利于你的学习&#xff0c;话不多说&#xff0c;开始今天的学习 1.创建文件 进入trae后&#xff0c;按住ctrlshiftP&#xff0c;输入Flutter&#xff1a;New Project&#xff0c;回车&#xff0c…...

AI 让无人机跟踪更精准——从视觉感知到智能预测

AI 让无人机跟踪更精准——从视觉感知到智能预测 无人机跟踪技术正在经历一场前所未有的变革。曾经,我们只能依靠 GPS 或简单的视觉识别来跟踪无人机,但如今,人工智能(AI)结合深度学习和高级视觉算法,正让无人机的跟踪变得更加智能化、精准化。 尤其是在自动驾驶、安防监…...

Launcher3体系化之路

&#x1f44b; 欢迎来到Launcher 3 背景 车企对于桌面的排版布局好像没有手机那般复杂&#xff0c;但也有一定的需求。部分场景下&#xff0c;要考虑的上下文比手机要多一些&#xff0c;比如有如下的一些场景&#xff1a; 手车互联。HiCar&#xff0c;CarPlay&#xff0c;An…...

用wireshark抓了个TCP通讯的包

昨儿个整理了下怎么用wireshark抓包&#xff0c;链接在这里&#xff1a;捋捋wireshark 今天打算抓个TCP通讯的包试试&#xff0c;整体来说比较有收获&#xff0c;给大家汇报一下。 首先就是如何搞到可以用来演示TCP通讯的客户端、服务端&#xff0c;问了下deepseek&#xff0c;…...

VR/AR 显示瓶颈将破!铁电液晶技术迎来关键突破

在 VR/AR 设备逐渐走进大众生活的今天&#xff0c;显示效果却始终是制约其发展的一大痛点。纱窗效应、画面拖影、眩晕感…… 传统液晶技术的瓶颈让用户体验大打折扣。不过&#xff0c;随着铁电液晶技术的重大突破&#xff0c;这一局面有望得到彻底改变。 一、传统液晶技术瓶颈…...

【前端】Vue中实现pdf逐页转图片,图片再逐张提取文字

给定场景&#xff1a;后端无法实现pdf转文字&#xff0c;由前端实现“pdf先转图片再转文字”。 方法&#xff1a; 假设我们在< template>中有一个元素存放我们处理过的canvas集合 <div id"canvasIDpdfs" />我们给定一个按钮&#xff0c;编写click函数&…...

焦虑而烦躁的上午

半年了&#xff0c;每逢周末或者节假日都被催着去医院。 今天早上依旧&#xff0c;还在睡梦之中&#xff0c;就被喊醒“赶紧得&#xff0c;抢上儿童医院的票了&#xff01;” 无奈&#xff0c;从床上爬起来&#xff0c;草草用过早餐之后&#xff0c;奔赴儿童医院&#xff01;…...

Python使用

Python学习&#xff0c;从安装&#xff0c;到简单应用 前言 Python作为胶水语言在web开发&#xff0c;数据分析&#xff0c;网络爬虫等方向有着广泛的应用 一、Python入门 相关基础语法直接使用相关测试代码 Python编译器版本使用3以后&#xff0c;安装参考其他教程&#xf…...

分类预测 | Matlab实现CNN-LSTM-Attention高光谱数据分类

分类预测 | Matlab实现CNN-LSTM-Attention高光谱数据分类 目录 分类预测 | Matlab实现CNN-LSTM-Attention高光谱数据分类分类效果功能概述程序设计参考资料 分类效果 功能概述 代码功能 该MATLAB代码实现了一个结合CNN、LSTM和注意力机制的高光谱数据分类模型&#xff0c;核心…...

【解决方案-RAGFlow】RAGFlow显示Task is queued、 Microsoft Visual C++ 14.0 or greater is required.

目录 一、长时间显示&#xff1a;Task is queued 二、GraphRAG消耗大量Token 三、error: Microsoft Visual C 14.0 or greater is required. Get it with “Microsoft C Build Tools“ 四、ModuleNotFoundError: No module named infinity.common; infinity is not a package 五…...