大型 SaaS 系统的数据权限就应该这么设计

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

权限的概述

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

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

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

功能权限

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

为何要基于RBAC

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

14d1e9aeaa80b84e3f9256b426def0b1.png
为何要基于RBAC

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

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

1428244a1494227b1ab7a53b8409d416.png
为何要基于RBAC

总结:

  1. 解耦用户和功能,降低操作错误率;

  2. 降低功能权限分配的繁琐程度。

5ac14bba9dfba49100c8962d0ef41059.png
为何要基于RBAC

功能粒度

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

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

用户的优先级

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

数据权限

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

数据权限和什么有关系

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

70803fc67a1880fd0ea660b69bf9fdbf.png
数据权限和什么有关系

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

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

数据权限的操作步骤

思想

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

用到数据权限的地方

  1. 用户添加时候,选择部门的下拉框

f83b7a8828fbf457166fc30b50e4c348.png
数据权限
  1. 部门管理的列表

38e28994fb0a774474d26dd54e6bbd9f.png
部门管理的列表
  1. 角色管理,新增弹框页面,选择部门的树状菜单

af57913eb8228244c68bb2f96485ef44.png
角色管理

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

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

b0611509a2af15f749767c168a7859b6.png
数据权限

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

c4d52f606a14f5fb771e193d9ba5c996.png
数据权限
9e2ad93c3ea125d029413d155d5de115.png
数据权限

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

  1. 在commonDataService类中的getCurrUserDataDeptIds()方法,获取当前登录用户的部门数据ids列表

5a13b58a64d95824ff0d2982cbe41eab.png
  1. 如果当前登录用户id为超级管理员,则加载全部菜单信息,如下图所示:

d9e553b97085e1fcc32c680abbde06e6.png
  1. 如果当前登录用户id不为超级管理员,通过用户id,获取sys_role_dpet,sys_user_role这两张表进行关联(「已拥有制定部门的权利且未占用」),获取该登录用户所属的部门id

026f6fdca387f3ba3f32f1996b476bbd.png
数据权限
  1. 数据权限用户已经分配且已经拥有的部门(「已拥有制定部门的权利且已占用」),「作用是选择了一个一级部门,那么一级部门所包含的二级部门,三级部门等也要赋值给用户,也就是说拥有的部门下面还有子部门,那么也具有该部门以及子部门的拥有权,使用递归算法全部遍历获得。」如下图所示

f4011f41a7bc20f7203ed1b8aaec8270.png
数据权限
4323216cbce8adec09b957df0fa83165.png
数据权限
669013f273444aa3188b687f126f12d9.png
数据权限
  1. 将当前登录用户所拥有的部门id通过逗号进行拼接

7b47c952cede3633c40ff5b6470b3e0a.png
数据权限

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

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

5f20f7793d26a2fc82975d2592983f8c.png
数据权限
2301be0b2381ae60f23c9ef54d2cb383.png
数据权限

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

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

27cca70cf13ba7966ab5f56fef46fc1a.png
数据权限
8b9ae60d4874bcca64e12b84aeb5c553.png
数据权限

操作案例

  1. 例如用户debug用户的角色为操作权限角色,分配部门为开发一部下面的测试部门

28d202ef728ad0512cbb21aa97e64727.png
数据权限
  1. 使用超级管理员,给操作权限角色分配数据权限,这里选择新分配一个开发二部下面的测试部,如下图所示:

c7d4fd45e7c802df7b6ff60f3bef6aa3.png
数据权限
  1. 使用debug用户登录查询

af0ad3e76cd8fc750ae4c71b237d3f71.png
用户登录查询

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

来源:blog.csdn.net/u011066470

 
 
 
 
往期推荐:
这套开源系统太牛了!仅需一分钟,安装部署一套自己的 SAAS 云建站平台!

我用ChatGPT 生成一个Spring Boot博客项目,一点代码都没写

一个注解实现 WebSocket 集群方案,这样玩才爽!

SpringBoot 中的自带工具类,开发效率增加一倍!

SpringBoot + 一个注解,轻松实现 Redis 分布式锁

Mybatis-Plus 开发提速器:mybatis-plus-generator-ui

SpringBoot 多数据源及事务解决方案

222252b41973eb062ab7483e92e9f16a.png

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值