Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >权限管理——多系统下的数据权限通用控制

权限管理——多系统下的数据权限通用控制

作者头像
政采云前端团队
发布于 2023-11-02 07:23:37
发布于 2023-11-02 07:23:37
4.6K00
代码可运行
举报
文章被收录于专栏:采云轩采云轩
运行总次数:0
代码可运行

大家好:

常见的,在项目实际开发中我们不光要控制一个用户能访问哪些资源,还需要控制用户只能访问资源中的某部分数据。这就是所谓的数据权限。典型的如列表数据权限,主要通过数据权限控制行数据,让不同的人有不同的查看数据规则。

行业背景

在互联网系统中,权限一般分为功能权限和数据权限,功能权限比较常见,因为通用性和复用性,业内有很多的通用框架和设计。但对应数据权限来说,由于数据权限强依赖客户组织架构和具体业务的关系,往往实现起来会比较复杂,很少有一个设计架构能完全覆盖住,所以大部分的系统都一致性的遵循此策略:如非必要的尽量不使用数据权限,必须要的则单独控制。

目前常见数据权限方案基本为硬编码,具体分为如下两种:一是拆分功能页面,即根据不同数据权限用户,通过复制拷贝的方式,增加多个类似的菜单,再通过功能权限配置来给不同用户设置不同的菜单,从而实现数据权限的控制;二是在功能对应的后端接口里做判断,对不同数据权限的用户,过滤不同的数据列表透出给用户。硬编码的方式显而易见的优点是技术难度低,实现简单。

但以上硬编码的方式,无论选择用哪一种,都无法解决系统灵活性的问题,每当系统有老的需求要变更或者新的需求要新增,对应的开发人员就不得不去调整编码,修改菜单和页面,由此可见,硬编码对开发的成本和运维的成本都比较高。与此同时,行业内常见的通用数据权限控制,大都是给单一业务使用,和业务耦合度较高,可能在当前业务客户端是通用可扩展的,但是在另一个业务客户端就无法做到无缝接入了。

因此,如何提高数据权限设置的灵活性,降低耦合性,是本领域技术人员需要解决的问题。

建设价值

首先来说一下,为什么我们要做这样一个多系统的数据权限控制装置?

大背景是我司当前有多个业务系统需要通过数据权限控制业务数据,它们的用户体系或相同或不同,控制维度各有定制。

于是产生诸如以下需求:

  • 权限可配置化
  • 支持业务快速接入
  • 模型统一

为了支持以上需求,于是理所当然的出现了如下一套多系统的通用数据权限控制系统。

系统介绍

本系统底层使用统一的一套模型,支持权限配置化,业务方可自定义权限维度,用户体系解耦,满足不同系统快速接入数据权限的业务场景。

数据权限

RBAC是经典的功能权限模型,它是 Role-BasedAccess Control 的英文缩写,意思是基于角色的访问控制。

运营事先会在系统中定义出各种不同的角色,不同的角色拥有不同的权限,一个角色实际上就是一组权限的集合。而系统的所有用户都会被分配到不同的角色中,一个用户可能拥有多个角色。使用这种模型可以极大地简化权限的管理。

但是,在该模型下,系统只会验证用户甲是否属于角色A,而不会判断用户甲是否能访问只属于用户乙的数据 Data。这种问题我们称之为“水平权限管理问题”。

所以,为了解决这个问题,我们基于 RBAC 模型下,又扩展了功能和维度的概念,使系统能基于角色控制用户的数据权限。如下:

同时,为了做到多系统通用,我们又对系统、功能、权限做了如下抽象:

模型把每个系统抽象成由一个个业务组成,业务下分解成多个功能,功能对应多个维度:

  • 数据权限的颗粒度为到功能,一个功能可包含多个 Rest 接口。
  • 功能下分多个维度,所谓的数据权限实际就是控制每个维度,维度最终对应的是每个功能业务数据的筛选字段。
  • 最终当所有都配置完成后,每个角色对应每个功能下就挂着多个数据规则。当用户访问具体功能时,根据用户角色的数据规则,返回对应数据。
  • 当固定值不满足业务需求时,提供开放端口给业务方,业务方可实现对应维度的选择项端口,来达到自定义维度对应值的目的。
数据规则

根据以上描述,显而易见的,要实现数据权限,最重要的是需要抽象出数据规则。

比如我们营销系统的订单列表,需要从下面几个维度来控制数据访问权限

销售人员只能看自己的数据;

a 部门的人只能看自己部门的数据;

a 部门的上级部门 A 的人能看自己部门的数据和下级 b 部门的人;

上面的这些维度就是数据规则。

这样数据规则的几个重点要素我们也明晰了,就是规则字段,规则表达式,规则值,上面三个场景对应的规则分别如下:

规则字段:创建人,规则表达式:= ,规则值:当前登录人

规则字段:所属部门,规则表达式:= ,规则值:a

规则字段:所属部门,规则表达式:in ,规则值:A,a

即数据规则由【维度+条件表达式+维度对应值】组成,业务数据的数据权限就是由多个数据规则组成的范围控制。具体模型如下:

接入流程

那么,本套多系统权限控制系统,到底该如何接入呢?大致流程如下:

按照此通用方案,数据控制整体接入过程如下:

1.业务确定需要数据权限接入的功能。

2.产品、开发、业务确认功能的维度。

3.运营在开发的支持下在运营管理端配置数据权限,包括支持的维度、表达式、固定值等等。如需自定义维度对应值,实现对应端口。

4.各系统管理员登录各自的数据权限配置端,设置每个角色的数据规则。

5.客户访问系统的具体功能,根据客户的角色,获得数据规则,根据数据规则组装业务数据返回。

接入案例-订单列表

订单是很常见的系统功能,当前,需要对不同员工查看订单的数据范围做控制,根据员工所属的部门不同,查看对应部门的订单列表。

步骤一:确定系统、功能、维度

系统:xxx系统 功能:订单列表 维度:部门

步骤二:管理端配置数据权限

步骤三:业务方接入 Sdk,实现自定义维度(部门)选择项配置端口

示意代码

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
/**
 * 获取维度选择项 
 */
List<DimensionOption> getDimensionOptionList(List<String> dimensionCodes);

步骤四: 对应api查询数据接口接入 Sdk,完成数据过滤

步骤五: 系统管理员配置角色数据权限

只要完成以上5步,就实现了接入数据权限的功能。整个流程只有接入 Sdk 的成本,1天内即可完成,快速、高效,极大的降低了成本。同时公司内所有系统都拥有了一套完整统一的权限控制系统。

Sdk 如何进行数据权限控制

那么,底层究竟是如何实现数据权限控制的?

以下是一个请求的控制链路:

权限 Sdk 是真正实现权限控制的核心组件。

Sdk 中的基石是一个个对外开放的端口,其中最底层的是上下文端口。接入方需实现这个端口接口,根据当前缓存用户封装数据权限上下文。如有自定义维度,需实现自定义维度选择项端口,返回业务自定义的维度选择项。

数据权限生效实现过程如下:

1.请求 Path 被 Sdk 拦截,通过正则匹配配置的权限 Api,匹配到说明需要被控制。

2.在功能接口中,Sdk 根据上下文端口获取当前请求上下文,根据上下文获取对应用户所有角色的数据权限。

3.根据数据权限设置的配置,组装权限控制的条件。

4.业务方查询时加上权限控制条件,得到的数据,就是控制了数据权限后的数据。

ps:本sdk只针对java语言的后端

如果业务方使用的是 MyBatis 的 Xml 原生语句, Sdk 会把所有的数据权限组装成对应的 Sql 片段,自动对XML查询注入该 Sql 片段;如果使用的是 MyBatis-plus 的 QueryWrapper 方式,Sdk 会把所有的数据权限自动注入到生成的 QueryWrapper 条件中。

业务方也可以自主使用权限控制配置查询数据,关闭 Sdk 的自动注入。

问题
  • 当前只能直接对数据库存在的字段进行控制,如果是间接条件,无法控制数据权限
  • 自动注入当前只支持 MyBatis 的 Xml 原生语句和 MyBatis-plus 的 QueryWrapper 方式,其他如 Jpa 等不支持
思考

还有更多的类似问题,都是多系统数据权限控制需要解决的。虽然具体到每个小点,单从技术的角度来说,可能未必很难,但要支持更多系统,具备更好的通用化,还有很长的一段路可走。这是一个会随着业务的发展,需要持续改进的工作。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2023-11-01,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 政采云技术 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
数据产品权限管理设计原则(一)
数据产品除了页面、功能权限外,还要多一层数据的权限,权限粒度经常会到指标和维度,比如针对销售人员设计的销售业绩统计报表,系统层面会把不同销售的数据在一个页面内展示,通过权限管理来控制能看到负责区域或者商家的数据,这个时候,对于同一个交易额的指标,就要控制到省份/城市,或者销售人员维度。同样,不同用户群体能够看到的指标可能也是不一样的,比如管理层要看到能够衡量业务整体表现情况的流量、订单、成本、服务等各个视角的指标,而某一具体的业务人员,如客服,原则上只应看到服务相关的指标。
数据干饭人
2022/07/01
2K0
数据产品权限管理设计原则(一)
单一系统与多系统的权限管理区别
在信息技术的快速发展和业务需求的多元化趋势下,许多企业和组织逐步转向多个系统的IT架构,以满足不同的业务需求。随之而来的是权限管理的复杂化问题。在单一系统和多系统中,权限管理存在显著的差异,这些差异影响着系统的安全性、操作便利性以及合规性管理。
KPaaS集成扩展
2024/11/14
1110
单一系统与多系统的权限管理区别
Shiro权限管理详解
1 权限管理 1.1 什么是权限管理 基本上涉及到用户参与的系统都要进行权限管理,权限管理属于系统安全的范畴,权限管理实现对用户访问系统的控制,按照安全规则或者安全策略控制用户可以访问而且只能访问自己被授权的资源。 权限管理包括用户身份认证和授权两部分,简称认证授权。对于需要访问控制的资源用户首先经过身份认证,认证通过后用户具有该资源的访问权限方可访问。 1.2 用户身份认证 1.2.1 概念 身份认证,就是判断一个用户是否为合法用户的处理过程。最常用的简单身份认证方式是系统通过核对用户输入的用户名和口令,
Java帮帮
2018/03/15
6.6K0
Shiro权限管理详解
Spring Security----RBAC权限控制模型,和权限相关知识点整理
我们开发一个系统,必然面临权限控制的问题,即不同的用户具有不同的访问、操作、数据权限。形成理论的权限控制模型有:自主访问控制(DAC: Discretionary Access Control)、强制访问控制(MAC: Mandatory Access Control)、基于属性的权限验证(ABAC: Attribute-Based Access Control)等。最常被开发者使用也是相对易用、通用的就是RBAC权限模型(Role-Based Access Control),本文就将向大家介绍该权限模型。
大忽悠爱学习
2021/12/07
2.7K0
Spring Security----RBAC权限控制模型,和权限相关知识点整理
Spring Boot 3 整合 Mybatis-Plus 实现数据权限控制
早期使用spring boot的时候写数据权限是通过使用自定义一个切面@Aspect配合自定义DataScope注解来实现。
Harry技术
2025/01/13
1650
Spring Boot 3 整合 Mybatis-Plus 实现数据权限控制
Spring Boot 3 整合 Mybatis-Plus 实现数据权限控制
早期使用spring boot的时候写数据权限是通过使用自定义一个切面@Aspect配合自定义DataScope注解来实现。
Harry技术
2025/01/13
1810
Spring Boot 3 整合 Mybatis-Plus 实现数据权限控制
如何设计一个通用的权限管理系统
一个系统,如果没有安全控制,是十分危险的,一般安全控制包括身份认证和权限管理。用户访问时,首先需要查看此用户是否是合法用户,然后检查此用户可以对那些资源进行何种操作,最终做到安全访问。
JAVA葵花宝典
2020/11/20
1.6K0
如何设计一个通用的权限管理系统
通用数据权限的思考与设计
如果想学习Java工程化、高性能及分布式、深入浅出。微服务、Spring,MyBatis,Netty源码分析的朋友可以加我的Java高级交流:787707172,群里有阿里大牛直播讲解技术,以及Java大型互联网技术的视频免费分享给大家。
java架构师
2019/04/18
3.1K0
通用数据权限的思考与设计
巧用 MyBatis Plus 实现数据权限控制
列表实现方案有两种,一是在开发初期就做好判断赛选,但如果这个需求是中途加的,或不希望每个接口都加一遍,就可以方案二加拦截器的方式。
程序员蜗牛
2024/04/24
8240
巧用 MyBatis Plus 实现数据权限控制
单点登录与权限管理本质:权限管理介绍
前面几篇文章介绍了单点登录的本质,包括cookie、session、重定向的基本概念,单点登录的基本交互流程,cookie的重要性和安全问题。单点登录能够确保:必须通过身份验证后,才能访问网站,且访问多个系统时,只需要登录一次。 该系列的完整写作计划,可见:系列概述 一般系统都会有多个角色,不同角色可访问的系统功能不同,通过给用户分配不同角色,决定用户可访问的系统功能。 继续介绍「单点登录与权限管理」系列的第一部分:单点登录与权限管理本质,本篇说说权限管理,主要从以下几个方面介绍: 权限管理的一般模型 权限
情情说
2018/04/27
3.5K0
单点登录与权限管理本质:权限管理介绍
权限管理系统介绍
权限系统是每个系统里面必备的最基本的系统,就像盖楼房必须先打好地基,权限系统就像这个楼房的地基一样,没有地基就无法盖好楼房。
万能数据的小草
2021/07/22
1.5K0
【玩转腾讯云】对象存储COS的权限管理分析
随着互联网和公有云的发展,越来越多的企业把数据放到公有云上,COS(Cloud Object Storage)作为腾讯云的对象存储产品,提供了高容量、高可靠、低成本的存储解决方案,也使得客户把越来越多的业务数据放到了COS上。
ictfox
2020/04/27
16.4K5
【玩转腾讯云】对象存储COS的权限管理分析
大话设计,没有模式—通用权限设计与实现
当代码写多了,总有些是经验,但经验是什么呢?if…else用的次数比别人多?显然不是。有些超棒的设计可以谓之经验!
盖世玉宝
2024/07/09
2020
如何实现一个权限管理系统?(附源码)
系统安全一直是在系统开发中不可规避的问题,而权限控制又跟系统安全密不可分,大到用户的访问,小到一个页面的按钮,都有可能涉及到权限的控制。而renren-security便给我们提供了一套权限系统开发的解决方案。
芋道源码
2019/06/21
1K0
如何实现一个权限管理系统?(附源码)
超级全面的权限系统设计方案
权限管理是所有后台系统的都会涉及的一个重要组成部分,主要目的是对不同的人访问资源进行权限的控制,避免因权限控制缺失或操作不当引发的风险问题,如操作错误,隐私数据泄露等问题。
良月柒
2019/10/14
7.9K0
超级全面的权限系统设计方案
数字化浪潮下,如何确保多系统权限设置的一致性与准确性?
随着信息技术的飞速发展,企业信息化建设呈现出多系统并存、高度集成的态势。为了满足不同业务需求,企业往往部署了诸如ERP、CRM、HRM、SCM、OA等各种业务管理系统,形成了一个由众多异构系统组成的复杂IT环境。这些系统各自承载着特定的业务功能,共同构成了企业的数字化运营基础。
金牌服务刘
2024/08/14
2390
数字化浪潮下,如何确保多系统权限设置的一致性与准确性?
KPaaS洞察|如何高效管理多个系统的权限?
在企业和组织中,通常会使用多个系统来管理不同的业务流程。然而,管理多个系统的权限是一项具有挑战性的任务,需要综合考虑安全性、效率和用户体验等多个方面。本文将探讨如何高效管理多个系统的权限,以确保系统的安全性和可用性。
KPaaS集成扩展
2024/11/13
1650
KPaaS洞察|如何高效管理多个系统的权限?
一款小清新的 SpringBoot+ Mybatis 前后端分离后台管理系统项目
今日推荐推荐3个快速开发平台 前后端都有 项目经验又有着落了 推荐一个高仿微信的项目 有点屌!! 一二线城市知名 IT 互联网公司名单(新版)
好好学java
2021/12/21
8370
权限系统这样通用设计,很稳!
权限管控可以通俗的理解为权力限制,即不同的人由于拥有不同权力,他所看到的、能使用的可能不一样。对应到一个应用系统,其实就是一个用户可能拥有不同的数据权限(看到的)和操作权限(使用的)。
码猿技术专栏
2024/01/09
6890
权限系统这样通用设计,很稳!
应用基础框架之权限控制
权限控制在每个应用中都必不可少,相似却又总不尽相同。有没有一种比较通用的设计甚至框架,可以让我们不用每次都去重复造这个轮子呢?本文主要是向大家介绍下我们的应用基础框架coframe,以及在权限控制方面的一些设计与实践。
yuanyi928
2019/05/15
1.1K0
推荐阅读
相关推荐
数据产品权限管理设计原则(一)
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验