Redian新闻
>
大型SaaS系统的数据范围权限设计与实现

大型SaaS系统的数据范围权限设计与实现

公众号新闻

点击上方“芋道源码”,选择“设为星标

管她前浪,还是后浪?

能浪的浪,才是好浪!

每天 10:33 更新文章,每天掉亿点点头发...

源码精品专栏

 
来源:blog.csdn.net/u011066470/
article/details/118003386

toB 的系统,除了普通的权限管理之外,往往还需要数据范围权限。本文介绍一种,简单的易实现的 Saas 多租户数据范围权限系统的简单设计与实现。

权限的概述

我们一般说权限的时候是在说「功能权限和数据权限」

功能权限指用「户登陆系统后能看到什么模块,能看到哪些页面」

而数据权限指的「是用户在某个模块里能看到几条数据,能看到哪些数据」

基于 Spring Boot + MyBatis Plus + Vue & Element 实现的后台管理系统 + 用户小程序,支持 RBAC 动态权限、多租户、数据权限、工作流、三方登录、支付、短信、商城等功能

  • 项目地址:https://github.com/YunaiV/ruoyi-vue-pro
  • 视频教程:https://doc.iocoder.cn/video/

功能权限

在企业系统中,通过配置用户的功能权限可以解决不同的人分管不同业务的需求,基于RBAC模型,RBAC(Role Based Access Control)模型,它的中文是基于角色的访问控制,主要是将功能组合成角色,再将角色分配给用户,也就是说「角色是功能的合集。」

为何要基于RBAC

企业A一共有12个功能,需要创建100个用户,这些用户中有管财务的、有管人事的、有管销售的等等。如果不引入RBAC模型,我们需要每创建一个用户就要分配一次功能,至少(每个用户只有一个功能)操作100次,如果人数增加到1000甚至10000,并且一个用户可能会有多个功能的时候,操作会非常繁琐,如图:

为何要基于RBAC

经过多次操作发现:分配给某些人的功能都是相同的,比如分配给A、B等10个用户的功能都是客户管理、订单管理及供应商管理这几个模块,那是不是可以把这几个功能模块打成一个包整体分给需要的用户呢?

这个包就叫做角色。由于角色和功能的对应关系相对固定,给用户分配权限的时候只分配角色即可。

为何要基于RBAC

总结:

  1. 解耦用户和功能,降低操作错误率;
  2. 降低功能权限分配的繁琐程度。
为何要基于RBAC

功能粒度

功能的粒度从粗到细一般分为:「模块级->页面级->接口级(接口级的功能权限指的是哪个角色能调用哪些接口)。」

从后台角度:为了系统安全,代码肯定都会实现到接口级。那我们做粒度选择的意义是什么?当然是为用户降本增效。只是粒度越粗,用户操作越简单,灵活性却越低。

用户的优先级

我们常用的优先级顺序是查看「详情>查看列表>增加、删除、编辑、其他操作按钮」

基于 Spring Cloud Alibaba + Gateway + Nacos + RocketMQ + Vue & Element 实现的后台管理系统 + 用户小程序,支持 RBAC 动态权限、多租户、数据权限、工作流、三方登录、支付、短信、商城等功能

  • 项目地址:https://github.com/YunaiV/yudao-cloud
  • 视频教程:https://doc.iocoder.cn/video/

数据权限

数据权限解决的是用户能看到多少数据量和什么数据的问题,例如A和B两个用户都能看到销售模块,但A能看到320条数据,B只能看到100条数据,且A能看到的320条数据中包含着B能看到的100条数据,这些都是由数据权限决定的。

数据权限和什么有关系

数据权限一般和企业的组织架构相关,而组织架构分为树状和扁平状的(还有更复杂组织架构,此处暂不做说明)

数据权限和什么有关系

「数据权限主要和组织架构有关」 ,组织架构中树状架构较为复杂,需要统一或者分模块的定义层级间数据共享问题。

数据权限定义过程中如果出现同一结点下的【用户间层级问题(上下级)】需要回到功能权限的【角色定义】去解决。

数据权限的操作步骤

思想

「数据权限的控制是通过部门的菜单展示来实现的。」

用到数据权限的地方

  1. 用户添加时候,选择部门的下拉框
数据权限
  1. 部门管理的列表
部门管理的列表
  1. 角色管理,新增弹框页面,选择部门的树状菜单
角色管理

部门管理中部门列表的数据权限

controller层加载部门列表,加载全部部门信息

数据权限

sevice层逻辑:将当前登录用户所拥有的部门id设置成查询部门列表的where的筛选条件

数据权限
数据权限

定义一个commonDataservice层:获取用户所具有的所有部门ids

  1. 在commonDataService类中的getCurrUserDataDeptIds()方法,获取当前登录用户的部门数据ids列表
图片
  1. 如果当前登录用户id为超级管理员,则加载全部菜单信息,如下图所示:
图片
  1. 如果当前登录用户id不为超级管理员,通过用户id,获取sys_role_dpet,sys_user_role这两张表进行关联(「已拥有制定部门的权利且未占用」 ),获取该登录用户所属的部门id
数据权限
  1. 数据权限用户已经分配且已经拥有的部门(「已拥有制定部门的权利且已占用」 ),「作用是选择了一个一级部门,那么一级部门所包含的二级部门,三级部门等也要赋值给用户,也就是说拥有的部门下面还有子部门,那么也具有该部门以及子部门的拥有权,使用递归算法全部遍历获得。」 如下图所示
数据权限
数据权限
数据权限
  1. 将当前登录用户所拥有的部门id通过逗号进行拼接
数据权限

用户新增弹框中的部门列表的数据权限

同样调用的是SysDepartController中的depart/list的方法,逻辑见2.3节

数据权限
数据权限

角色管理中新增弹框中的部门列表的数据权限

同样调用的是SysDepartController中的depart/list的方法,逻辑见2.3节

数据权限
数据权限

操作案例

  1. 例如用户debug用户的角色为操作权限角色,分配部门为开发一部下面的测试部门
数据权限
  1. 使用超级管理员,给操作权限角色分配数据权限,这里选择新分配一个开发二部下面的测试部,如下图所示:
数据权限
  1. 使用debug用户登录查询
用户登录查询

关于数据范围权限的设计与实现,你有什么好的方案?欢迎留言评论!



欢迎加入我的知识星球,一起探讨架构,交流源码。加入方式,长按下方二维码噢

已在知识星球更新源码解析如下:

最近更新《芋道 SpringBoot 2.X 入门》系列,已经 101 余篇,覆盖了 MyBatis、Redis、MongoDB、ES、分库分表、读写分离、SpringMVC、Webflux、权限、WebSocket、Dubbo、RabbitMQ、RocketMQ、Kafka、性能测试等等内容。

提供近 3W 行代码的 SpringBoot 示例,以及超 4W 行代码的电商微服务项目。

获取方式:点“在看”,关注公众号并回复 666 领取,更多内容陆续奉上。

文章有帮助的话,在看,转发吧。

谢谢支持哟 (*^__^*)

微信扫码关注该文公众号作者

戳这里提交新闻线索和高质量文章给我们。
相关阅读
操作系统:文件系统的实现盘点2022年的数据库/数据仓库/数据湖市场(上)。。。UNReal 每周一场主题电音节|本周六𝘿𝙧𝙪𝙢 𝙣' 𝘽𝙖𝙨𝙨 炸裂舞池!Alluxio跨集群同步机制的设计与实现第一次登陆要更新EVUS系统吗?|移投路群问答RPA带来6位数的人力工时节约,但全民低代码时代还未到来|顺丰供应链的数字化探索与实践深化DTCO战略,概伦电子一站式工程服务深度联动设计与制造SpringBoot 统一功能处理:用户登录权限校验-拦截器、异常处理、数据格式返回魏牌蓝山DHT-PHEV开启预定,定位6座中大型SUVChatGPT复古玩法:39年前老电脑+DOS系统也能玩转很全的敏感词匹配系统的设计与实践低延时直播技术优化实践,画质增强技术应用实践,云剪辑架构设计与演进,Web端音视频通话技术探索浅谈复杂业务系统的架构设计品尝玫瑰的浪漫盘点2022年的数据库/数据仓库/数据湖市场(下)——Teradata退出中国市场了,Oracle还没走。。。回忆往年过春节从2023年一季度的数据,看清中国经济的真实现状活动预告 | “‘数据二十条’背景下的数据要素化”研讨会暨《数据要素化100问:可控可计量与流通交易》新书发布会即将召开得物热点探测技术架构设计与实践首期《股权设计与股权激励》两天课程回顾!当 App 有了系统权限,真的可以为所欲为?2023 除夕夜,简单的年夜饭和这两天吃喝降本30%,酷家乐海量数据冷热分离设计与实践匹兹堡记事 - 2022.12.26 陕西面馆突破困境!美国纽约首次开课《合伙人股权设计与股权设计》突破!解决!找马方!亲友重来 蓬荜生辉 陈湃(巴黎)Offer捷报 l Cornell BDS Offer+1!恭喜里海大学L学姐获得康奈尔大学生物统计与数据科学硕士录取!【公开课预告】开放XCDN直播方案设计与实践vivo自研Jenkins资源调度系统设计与实践如何高效实现MySQL与elasticsearch的数据同步微软改进版IVAS系统将在2025年部署这种千言万语又不能说的状态,是不是才是一种精确的事实呢? | 向帆「见所未见:信息的设计与艺术」上线ClickPrompt:一站式 Prompt 学习、设计与运行工具(开源),支持 ChatGPT 等渐近式 AI 编程架构:Unit Mesh 架构的设计与探索把人生数据化随时翻看,《流浪地球2》里的数字生命快实现了?
logo
联系我们隐私协议©2024 redian.news
Redian新闻
Redian.news刊载任何文章,不代表同意其说法或描述,仅为提供更多信息,也不构成任何建议。文章信息的合法性及真实性由其作者负责,与Redian.news及其运营公司无关。欢迎投稿,如发现稿件侵权,或作者不愿在本网发表文章,请版权拥有者通知本网处理。