java多级部门数据权限设计_数据权限设计(转载)
一、前言
几乎在任何一个系统中,都离不开权限的设计,权限设计 = 功能权限 + 数据权限,而功能权限,在业界常常是基于RBAC(Role-Based Access Control)的一套方案。而数据权限,则根据不同的业务场景,则权限却不尽相同,应该根据具体的场景巧妙设计; 且必须在项目开始时进行设计,不像功能权限一样,在项目结束的时候在追加。
注:更细还可以加入字段权限
1.1 权限类型
【功能权限】:能做什么的问题,如增加产品。
【数据权限】:能看到哪些数据的问题,如查看本人的所有订单。
【字段权限】:能看到哪些信息的问题,如供应商账户,看不到角色、 部门等信息。
二、数据权限设计
2.1 应用场景
订单,可以由本人查看
销售单,可以由本人或上级领导查看
销售单,销售人员可以查看自己的,销售经理只查看 销售金额大于100,000的。
2.2 数据权限设计分析
数据权限跟功能权限有非常大的不同,颗粒度非常小。贯穿于整个项目的开发周期中,无法像功能权限一样在项目要结尾的时候追加。数据权限做不到组件级别,必须在项目设计阶段就已经规划好。之前看网上相同有人想基于SPRING切面的原理去实现数据权限,这样就能够做到了低侵入、低耦合,想法非常好。但是现实非常骨感,这样做使整个应用系统效率大减折扣,相同对数据权限的控制策略也非常不灵活
2.3 SQL语句可扩展,数据权限设计分析
数据权限往往作为功能权限的高级行为。能够从数据对象的幅度方面进行控制。比方用户仅仅能看自己的订单、普通会员看不到某数据对象的高级属性(字段)等等。颗粒度这么细的情况下对结果集处理显然是不可能了,这时仅仅能介入到SQL语句中,此时又不想在开发阶段让开发者过多的考虑数据权限的问题,这个时候就需要将sql 和数据权限策略分开。再调用接口的时候,进行数据权限接口的拼接。这样也算做到的代码的低侵入。
2.4 SQL语句高效解析处理
数据权限模块的核心之中的一个就有SQL语句的高效解析处理,SQL处理指依据当前登录人信息及数据权限策略生成一个带有数据权限处理结果的SQL语句。所以这里对SQL语句的解析处理必需要求精确、准确。在开发阶段由开发者把SQL写入到配置文件里,在执行阶段由数据权限取得该SQL进行分析处理(加上数据权限),这样就完毕了SQL的组装处理。
2.5 数据权限策略设计
最核心的地方就是数据权限策略的设计了,这里先引入几个概念:
资源:数据权限的控制对象,业务系统中的各种资源。比方订单单据、销售单等
主体:用户、部门、角色等
条件规则:用于检索数据的条件定义
数据规则:用于【数据权限】的条件规则
简单例子:包含了资源,主体,规则。
规则应用中:销售员只能查看到自己的销售订单。
2.6 思考两个问题:
第一,如何配置
第二,如何拼接sql语句
2.6.1 应用示例
订单,可以由本人查看
销售单,可以由本人或上级领导查看
销售单,销售人员可以查看自己的,销售经理只查看 销售金额大于100,000的。
我们能想到直接的方法,在访问数据的入口加入SQL Where条件来实现,组织sql语句
where UserID = {CurrentUserID}
where UserID = {CurrentUserID} or {CurrentUserID} in (领导)
where UserID = {CurrentUserID} or ({CurrentUserID} in (销售经理) and 销售金额 > 100000)
这些一个一个的条件,简单理解为一个【数据规则】。
不同的人应该对应不同的规则,那么也可以理解为,一个用户对应不同的角色,每一个角色有不一样的【数据规则】,那么设计就变成
【资源】 - 【主体】 - 【数据规则】
根据提供者的不同,准备不同的权限应对策略。
2.6.2 资源 - 规则
使用JSON 格式,将资源和规则得到应用。
{
"rules": [{
"field": "CustomerID",
"op": "like",
"value": "AN",
"type": "string"
}],
"op": "and"
}
上面的格式再考虑安全性的时候,不够高,推荐下面这种方式:
{
"rules": [{
"field": "OrderDate",
"op": "less",
"value": "2012-01-01"
},
{
"field": "CustomerID",
"op": "equal",
"value": "VINET"
}
],
"op": "and"
}
(过滤规则分为三个部分:【分组】、【规则】(字段、值、操作符)、【操作符】(and or),而自身就是一个分组。)
规则描述:
查找顾客VINET所有订单时间小于2011-01-01的单据
这样的数据是安全的,而且是通用的(你甚至可以再加一个OR子查询)。无论是在前端还是后台,无论你使用什么样的组件,都可以很好地利用。
通用后台的翻译,就可以生成这样SQL的参数:
Text:
([OrderDate] < @p1 and [CustomerID] = @p2)
Parameters:
p1:2012-01-01
p2:VINET
2.6 字段权限
如果说数据权限是对功能权限在纵向的扩展,那么字段权限就是在横向的扩展。可以禁止指定用户/角色 对某些字段的访问
java多级部门数据权限设计_数据权限设计(转载)相关推荐
- 数据图表可视化_数据可视化如何选择正确的图表第1部分
数据图表可视化 According to the World Economic Forum, the world produces 2.5 quintillion bytes of data ever ...
- java闹钟程序设计_JAVA课程设计_闹钟的设计与实现项目-报告_附源代码.doc
JAVA课程设计_闹钟的设计与实现项目-报告_附源代码 第2章 MACROBUTTON AcceptAllChangesInDoc [双击此处键入1级标题] PAGE 2 - PAGE 1 - .. ...
- java 通用权限管理_通用权限管理设计篇(一)
一.引言 因为做过的一些系统的权限管理的功能虽然在逐步完善,但总有些不尽人意的地方,总想抽个时间来更好的思考一下权限系统的设计. 权限系统一直以来是我们应用系统不可缺少的一个部分,若每个应用系统都重新 ...
- fullcalendar 数据渲染 背景色_数据可视化设计,从0到1必备技能
无论是日常制作可视化图表报告,还是制作可视化大屏,很多设计师或者数据分析师往往会因为重点突出数据的重要性,而让可视化图表变得枯燥乏味.或者会因为过度注重绚丽多彩而让数据的呈现效果大打折扣.如何把握设计 ...
- 数据分析师入门_数据分析师入门基础指南
数据分析师入门 Back in the summer of 2018, I was just starting my first internship as a Data Analyst. 早在201 ...
- 鲜活数据数据可视化指南_数据可视化实用指南
鲜活数据数据可视化指南 Exploratory data analysis (EDA) is an essential part of the data science or the machine ...
- python数据科学手册_数据科学的Python
Python是开源的,可解释的高级语言,为面向对象的编程提供了很好的方法.它是数据科学家用于各种数据科学项目/应用程序的最佳语言之一.Python提供了强大的功能来处理数学,统计和科学功能.它提供了出 ...
- 大数据平台蓝图_数据科学面试蓝图
大数据平台蓝图 1.组织是关键 (1. Organisation is Key) I've interviewed at Google (and DeepMind), Uber, Facebook, ...
- etl数据抽取工具_数据同步工具ETL、ELT傻傻分不清楚?3分钟看懂两者区别
什么是数据同步工具(ETL.ELT) 数据同步工具ETL或者ELT的作用是将业务系统的数据经过抽取.清洗转换之后加载到数据仓库的过程,目的是将企业中的分散.零乱.标准不统一的数据整合到一起,为企业的决 ...
- 成都python数据分析师职业技能_数据分析师需要什么技能,数据分析行业都有什么职业?...
就目前而言,很多人看到了数据分析行业的光明前景,于是就想进入数据分析的行业中,但是,想成为一名合格的数据分析师,需要掌握很多的技能,那么一名合格的数据分析师需要掌握哪些技能呢?现在的数据分析行业中有数 ...
最新文章
- 你想要的生物信息知识全在这——生信宝典文章目录
- android怎么搭建人脸库,OpenCV-2.4.6-android-sdk 人脸识别demo搭建
- 职业经理人的核心技能
- 8、设计模式-结构型模式-适配器模式
- IE6 式样表 Bug
- pi节点虚拟服务器怎么弄,pi怎么用云服务器做节点
- 跟我学大数据分析之四:“钱”去哪儿了?
- java web windows_Java Web服务器部署指南(windows版)
- [导入]Spring Web Flow
- 百度进军游戏;腾讯起诉抄袭者;苹果急撤 watchOS 5.1 更新 | 极客头条
- jquery中常见的标题内容之间的切换
- 机器学习第六回(完结篇)
- (转)国外优秀区块链创业公司梳理
- unity2D 箭头动画(给猛虎桥章节做动画演示一)
- ROS双臂定点抓取问题记录
- CentOS7.x 安装 openssh8.4、openssl1.1.1
- Python图像增强
- xinetd使用指南
- 【Android开发日记】jsonObject = new JSONObject(info)报错 A JSONObject text must begin with '{' at character
- 802.11与802.3数据帧转换(即有线和无线数据帧转换)
热门文章
- 计算机通过镜子测试,镜子测试
- VelocityTracker 滑动速度跟踪器 简介
- ‼ gifsicle pre-build test failed
- 九款远程办公软件,打破时空限制
- 制作Docker镜像,用来下载OpenJDK11源码
- android云控开源,Android EasyClient 云台控制开源流媒体摄像机EasyCamera
- python爬虫万能代码-python网络爬虫源代码(可直接抓取图片)
- 视频格式转换(avi、wmv、flv、mkv、rmvb、rm、3gp转MP4、MP3)边学边开发
- Python搭建QQ聊天机器人极简教程
- 怎么改java的gre_GRE怎样完成60天小白到大神的蜕变?