在企业管理系统中,常常有这样的要求: 
1. 用户一般只能查看自己部门的数据 
2. 可以设置用户可以查看哪些部门的数据 
这种权限的控制,一般称为数据权限,与之对应的功能权限,则是系统中哪些功能可以使用——①菜单、按钮等元素能正常显示;②如果用户访问了本身不可见的功能,系统也能阻止(访问控制)。

开发时间长了,就发现编程一般就是两个问题: 
1. 在哪里设置(数据从哪里来) 
2. 在哪里使用(数据到哪里去) 
比如工作流引擎,设置,即在界面上拖画流程图,并保存为特定的xml数据;使用,即流程引擎解读xml数据,使其正确的按照用户的意图执行程序。 
数据权限的问题,同样可以分成这两个问题来处理。

设置的问题: 
在用户设置界面,设置用户的管辖权限

做到这样的设置界面,并不困难。

在这里,主要要解决的一个问题是,如何把这种关系存储下来 
常规方案:使用关联表[用户ID,组织ID] 
可是发现,一旦组织机构数量多了以后(如省市县乡,一般一个省就有1000个乡/街道以上),再加上用户数量多了以后——往往是组织机构节点越多,则用户也越多。理论上,这个关联表的数据量将到达千万级(仅理论上,因为对于绝大多数用户来说,仅能访问本部门数据)。

创新方案:组织机构使用code做主键,并且在用户表中新建字段为“已授权的组织(authorized_orgs)”,直接使用字符串逗号分隔的方式将该关系存起来。 
可是马上会发现,这个字段会很长很长,一个4级的组织,一般需要8位长的代码,如果选中的全部数据,按1000个单位来算,就会有9000长度(含逗号)的字符串。 
这里有一个取巧的办法,对于全选了数据,只保存上级单位的code,下级单位就不保存了——因为选中了上级就必然下级全部选上了。

该办法要求上下级代码存在一种明显的关系,如上级代码为 0100,下级代码0101。 
这个取巧的办法,理论上依然不能规避很长的组织机构代码(如选的全部是叶子节点数据),但在实践中,却是很好的办法——应该很少出现全部只选叶子节点,而不选父级节点的。 
使用zTree(js的树)的代码,可以这样写

if(zTree==null){ return; } var nodes = zTree.getNodes(); var arr = []; for(var i=0; i<nodes.length; i++){ pushToArray(arr, nodes[i]); } console.log(arr.join(",")); obj.authorizedOrgs = arr.join(","); function pushToArray(arr, node){ if(!node.checked){ return; } if(node.check_Child_State==2||node.check_Child_State==-1){//是节点完全选上(即不是半选状态)或叶子节点,直接添加
        arr.push(node.code); }else if(node.check_Child_State==1){//节点半选状态,递归往下找完全选中状态的 for(var i=0; i<node.children.length; i++){ pushToArray(arr, node.children[i]); }    }
}

-----分割线:以上解决怎么设置的问题,以下讨论怎么解决使用的问题--------

数据权限控制的基本思路,一般是会执行的SQL语句中添加where条件,以便限定查出的数据, 
如 where 所属机构 in (用户可访问的机构) 
而不是在数据查询出来之后,再到代码中进行过滤——因为一般都会对数据进行高效分页,如果已经查询出来数据,再在代码中进行过滤的话,就可能出现一页数据不足一页的情况,数据总数也会与实际页面上查出的数据行不一致。

第一步,在需要进行过滤的表中,要添加一个字段,如org_code,标明每条记录所属的组织机构。 
第二步,在查询语句中加入过滤条件。 
我们要加入的SQL语句,大概如下: 
where 所属机构 in ('ZZ0101', 'ZZ0102',...) 
假如我们前面存的代码是'ZZ0100,ZZ0201',其中存的是其父级节点'ZZ0100',代表了 'ZZ0101', 'ZZ0102', ... 
所以要写成 
where ((所属机构 like 'ZZ01%') or (所属机构='ZZ0201')) 
拼凑这样的SQL语句估计也是比较麻烦的一件事,有没有简便一点的方法呢?答案是有。 
经查,oracle,sqlserver,mysql都是支持正则式查询的。 
这样,我们可以把'ZZ0100,ZZ0201'变成一个正则式,放入条件中进行查询即可! 
变成正则式就是 '(^ZZ01.*)|(^ZZ0201)',在mysql使用正则式查询,就是 where 所属机构 RLIKE '(^ZZ01.*)|(^ZZ0201)' 
变成正则式之后,也便于放入session中进行存储。 
什么,你的数据库支持正则式,orm不支持正则式,那还用orm做什么?

实现数据权限控制的一种方法相关推荐

  1. java 数据 权限_Java如何利用Mybatis进行数据权限控制详解

    前言 权限控制主要分为两块,认证(Authentication)与授权(Authorization).认证之后确认了身份正确,业务系统就会进行授权,现在业界比较流行的模型就是RBAC(Role-Bas ...

  2. Java利用Mybatis进行数据权限控制

    权限控制主要分为两块,认证(Authentication)与授权(Authorization).认证之后确认了身份正确,业务系统就会进行授权,现在业界比较流行的模型就是RBAC(Role-Based ...

  3. 权限控制的两种主要方式详述

    权限控制的两种主要方式详述 粗粒度URL级别的权限控制 权限控制主要分为粗粒度URL级别的权限控制和细粒度的方法级别权限控制. 我们在后台系统的操作,无论 是点击一个按钮,还是点击一个菜单项,都是在访 ...

  4. mysql php gpl_MySQL_MySQL数据库远程访问权限如何打开(两种方法),下载GPL版本安装MySQL Community - phpStudy...

    MySQL数据库远程访问权限如何打开(两种方法) 下载GPL版本安装 MySQL Community Edition(GPL) Community (GPL) Downloads » 在我们使用mys ...

  5. [转]asp.net导出数据到Excel的三种方法

    原文出处:asp.net导出数据到Excel的几种方法(1/3) .asp.net导出数据到Excel的几种方法(2/3).asp.net导出数据到Excel的几种方法(3/3) asp.net导出到 ...

  6. 实现权限控制_SpringCloud 微服务实现数据权限控制

    前章讲了如何进行用户权限验证<SpringCloud下的用户鉴权方案>,它是微服务下统一资源访问权限的控制,就像一道墙保护着SpringCloud集群下的各个业务应用服务.而本章要讲的是权 ...

  7. 基于SpringAOP实现数据权限控制

    基于SpringAOP实现数据权限控制 在此主要是实现对用户查询数据返回字段的控制.比如一个表格有A,B,C,D,E五列,用户U1只能查看A,B,C三列. 此文章讲述的内容并不能实现在查询时仅查询A, ...

  8. 天鸟技术中台-建设过程-日常经验2:通用参数和数据权限控制

    技术中台,服务于 无数个 独立的项目. 每个项目,单独对应1个App和appId. 查询和创建等接口,必须提供appId,区分是哪个app的数据. 而技术中台的平台管理端,是管理所有的数据,appId ...

  9. 后台管理系统2——数据权限控制

    文章目录 1 数据权限控制 1.1数据库的修改 1.2 后端代码的修改 1.3 前端代码的修改 1.4 Aside组件的修改 1 数据权限控制 通过不同的身份进行实现不同的功能. 1.1数据库的修改 ...

最新文章

  1. php 几十万数据导出到csv
  2. ​Efficient GlobalPointer:少点参数,多点效果
  3. 请求发送者与接收者解耦——命令模式
  4. 谁是赢家_赢家的真正作品是股东
  5. 关于召开中国医药教育协会医学基因组学与生物信息学专业委员会成立大会暨临床全基因组外显子组家系数据分析培训会的通知...
  6. STMP发送邮件被当垃圾邮件处理的解决方法
  7. 在一起计时器_拥有计时器的四个怪兽,一个从杰克身上拿的,一个差点打死赛罗...
  8. 自动化Python+selenium 用这一篇学习就够了
  9. NR LTE UMTS GSM CDMA TDS频点频率换算工具
  10. STM32F4 + HAL库 + W25Q256的验证
  11. 词类与句子成分对应关系 —— 状语篇
  12. 虚拟服务器怎么选操作系统,虚拟主机怎样选择合适的操作系统
  13. 录音自动上传到服务器,怎么实现手机录音之后,将录音的音频文件上传到服务器上...
  14. 每位开发人员都应铭记的10句编程谚语
  15. 2020-11-30 网络爬虫
  16. ConcurrentHashMap1.7 最最最最最详细源码分析
  17. zemax模拟ld_使用ZEMAX 序列模式模拟激光二极管光源
  18. 《数据结构与算法》——树与二叉树之遍历总结
  19. 辛酸,面试蚂蚁Offer的经验都在这里了!
  20. 格雷希尔GripSeal外螺纹快速连接器的优点和注意事项

热门文章

  1. css两端对齐IOS不适用 样式冲突
  2. 自我精进的底层逻辑—方法论
  3. oracle dba常用命令
  4. let和var的区别
  5. Linux系统介绍 磁盘分区 rhel安装
  6. 云和恩墨携手EasyStack 共话开源创未来
  7. java计算机毕业设计虚拟物品交易网站源码+系统+数据库+lw文档
  8. 如何应用知识管理,成就高绩效项目?
  9. 我常用之呼和浩特快递联系电话(顺丰、申通、圆通 转)
  10. Linux显示行号设置