2026/8/25 10:01:39

FuAdmin数据权限实现原理:如何按部门数据范围精准过滤查询的完整指南

FuAdmin数据权限实现原理:如何按部门数据范围精准过滤查询的完整指南 FuAdmin数据权限实现原理如何按部门数据范围精准过滤查询的完整指南【免费下载链接】fu-admin采用当前最流行的技术栈 Vben Vue Vue3 Python Django NinjaFast Api 和 Django的结合开发的后端管理系统项目地址: https://gitcode.com/gh_mirrors/fu/fu-adminFuAdmin 是采用 Vue3 Django Ninja 技术栈开发的后端管理系统其内置的数据权限Data Permission机制允许管理员按部门数据范围精准控制每个角色能查询到的数据仅本人、本部门、本部门及以下、自定义部门、全部数据五档权限让敏感数据隔离开箱即用。本文带你从原理到源码看懂它是如何自动为查询注入部门过滤条件的。为什么需要数据权限在后台管理系统中功能权限只能控制能不能进入页面而数据权限控制的是能看哪些行数据。以 FuAdmin 的多租户场景为例销售 A 只能看到自己创建的工单华东区经理能看整个华东区含下属分支的工单超级管理员能看到全部数据。FuAdmin 通过角色Role→ 数据范围data_range→ 部门Dept三层关系在每次列表查询时自动拼接过滤条件开发者几乎零成本即可获得数据隔离能力。核心代码集中在后端工具层权限注入入口fu_crud.py数据权限核心逻辑fu_auth.py角色数据范围定义system/models.py五档数据范围一张表看懂权限模型数据范围的定义位于 system/models.py 的Role模型中data_range字段配合DATASCOPE_CHOICES提供五种选择同时角色还可通过多对多关系dept关联若干部门用于自定义模式值数据范围过滤行为0仅本人数据按creator_id过滤1本部门数据按belong_dept精确过滤2本部门及以下按belong_dept__in过滤递归取全部下级部门3自定义数据按角色关联的部门列表过滤4全部数据不过滤核心实现data_permission 函数数据权限的灵魂是 fu_auth.py 中的data_permission函数其执行流程非常清晰解析当前用户通过 JWT Token 从请求头中取出用户信息get_user_info_from_token超级管理员直通is_superuser用户直接返回原始过滤条件不做任何限制取最大权限范围用户可能拥有多个角色系统取所有角色中数值最大的data_range保证就高不就低按范围注入过滤条件数据范围注入的过滤字段说明仅本人filters.creator_id 用户ID只能查自己创建的数据本部门filters.belong_dept 用户部门ID精确匹配用户所在部门本部门及以下filters.belong_dept__in 部门ID列表递归收集所有子部门自定义filters.belong_dept__in 角色关联部门取角色配置的部门集合全部不注入保持原始查询其中本部门及以下依赖 usual.py 的get_dept函数它以整张部门表为输入递归遍历parent外键把用户部门及其所有子孙部门 ID 汇总成一个集合再用in条件一次性过滤避免了逐层 SQL 查询。无缝集成retrieve 查询入口过滤条件如何真正生效答案在通用查询函数 fu_crud.py 的retrieve中def retrieve(request, model, filters: FuFilters FuFilters()): # 根据请求和过滤条件应用数据权限控制 filters data_permission(request, filters) ... query_set model.objects.filter(**filters.dict(exclude_noneTrue))整个链路可以概括为一条流水线列表接口 → retrieve() → data_permission() 注入部门条件 → Django ORM filter() → 分页返回这里有两个巧妙的设计过滤字段统一约定fu_ninja.py 中的FuFiltersSchema 预定义了creator_id、belong_dept、belong_dept__in三个字段业务模型的列表接口只要声明了belong_dept数据所属部门和creator_id创建人字段数据权限即可自动生效数据源头打标新增数据时fu_crud.py 的create函数会自动从 Token 中提取当前用户把creator_id、belong_dept、modifier写入记录。写入时打标、查询时过滤数据权限闭环完成。多角色与导出场景的覆盖FuAdmin 的处理细节还覆盖了两个容易踩坑的场景多角色叠加用户同时拥有仅本人和本部门两个角色时代码使用max(list(data_range_qs))取权限范围最大的角色生效避免用户被多个角色越配越窄。数据导出导出接口 fu_crud.py 的export_data内部同样调用retrieve这意味着 Excel 导出的范围与列表查询严格一致——管理员导不出权限之外的数据从根源上防止绕过页面导出全量数据。总结FuAdmin 数据权限的设计要点回顾整套机制FuAdmin 数据权限的实现可以总结为四个关键设计权限挂在角色上data_range字段五档可选配合多对多dept关系支持自定义部门集合过滤条件集中注入所有查询统一经过retrieve → data_permission一条链路杜绝各接口自行其是的遗漏部门树递归一次取全get_dept递归收集下级部门in条件一次过滤兼顾正确性与性能写入打标 查询过滤创建数据时自动记录creator_id与belong_dept让过滤有锚点可依。对于正在开发后台系统的团队来说这套范围枚举 统一查询入口 部门树递归的模式是一个值得直接借鉴的轻量级数据权限方案。更多权限相关源码可参考 backend/utils/ 与 backend/system/apis/role.py。【免费下载链接】fu-admin采用当前最流行的技术栈 Vben Vue Vue3 Python Django NinjaFast Api 和 Django的结合开发的后端管理系统项目地址: https://gitcode.com/gh_mirrors/fu/fu-admin创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考