浅谈数据权限

好久没有更新博客了,最近也没有再回顾或研究新的明确的技术,也就没有写,正好乘着周末,就把这阵子研究的东西分享分享,但愿对大家都有帮助;
这阵子其实活也比较杂吧,各种事;不过主线还是在研究关于数据权限的问题;(另外多说一句,文档的功底还是得练啊,前期可以借鉴一些成功作品的文档来提高内涵,因为自己现在的文档总结能力还是比较差的,自己一看都有点儿大白话的感觉,因此这个还是得多看多写,多练习啊)
首先我先把这个命题描述一下:用户对每一条数据都有不同的权限,数据之间并没有什么规则关系,只是一条一条的单独数据。
这种情况下怎样对用户赋予权限呢,其实这种情况挺麻烦的,一般场景也不会有这种离谱的需求;
唯一我能想到的也就是数据库的各个字段之间应该是有这种需求了;它在一般上层上(除了列以外)都是在其数据字段上单独存一列,因为会有创建者的问题,因此判断时,除了判断读写权限外,还会判断创建者,因为创建者是拥有所有权限的。
刚接到这条任务的时候也挺迷茫的,因为是在web中应用,还要和数据库进行多次的数据传递或者存储什么的,要保证性能的情况下到底应该怎么做呢?
反正也没有思路,就直接google先大海捞捞针吧,这么一捞,其实对于解决这个方法还是没有思路但是却清楚了以前比较模糊的概念,先大概安利一下:
权限大体分为数据权限和功能权限,一会儿再说具体的概念;
我先简单描述一下:所谓功能权限,估计大家平常在项目中用到的也挺多的,无非是在某些功能或按钮上设置一些标识字段,然后在数据库中建立一个关联表,设置用户和功能标识的关系,然后前台一个if就搞定。这方面其实很多的框架都成体系了,在市面上都是很流行的,比如:spring的shiro,ralasafe等。
但是数据权限,无非就是用户有没有某条数据的访问或者其他修改删除等权限;若是就几条数据也不用这么麻烦了,直接就像功能权限关联似得操作即可,但既然是数据,怎么可能少呢,而且数量也不是确定的,这就难办了。

最终其实还是回归本质,不管过程如何,存储上还是只得两种,一是:将所有用户拥有的数据的标识存到用户表的列中;二是:在每条数据的列中存储用户权限标识。
刚开始我用的是方法一,在一般数据下(不加查询、修改等权限)感觉应该是没有问题的,不管是保存,修改什么的都应该很方便;
但是场景确实大数据,而且频繁的修改权限,所以不能使用方法一;
二方法虽然在查询方面比较的吃亏,但是我们可以用数据库方面的优化来弥补这个漏洞;

参考:http://wenku.baidu.com/link?url=JFBOG6JHu9ObMyMWMgQjRmdwIUNESpyZhek0xU31S168eyzZKoPpA0qssNXVb6RnDjCzU5LYtTSYJxK7kJxXwQEMjUucMPzNHOiiFU2PxWO
http://www.cnblogs.com/binblog/p/3890031.html
http://blog.csdn.net/hanxuemin12345/article/details/44731289?foxhandler=RssReadRenderProcessHandler
http://blog.csdn.net/xiexuan2007/article/details/18797039
http://blog.csdn.net/tinygroup/article/details/50803908
http://www.cnblogs.com/leoxie2011/archive/2012/03/20/2408542.html
https://my.oschina.net/tinyframework/blog/653256?p=2&temp=1467851225254
http://www.jb51.net/article/51042.htm
http://blog.csdn.net/aibisoft/article/details/50688116
http://blog.csdn.net/lipc_/article/details/52331654
http://sec.chinabyte.com/192/8593692_3.shtml
http://sec.chinabyte.com/213/11844713_2.shtml
http://blog.csdn.net/zhangyuehuan/article/details/24326367
http://v.youku.com/v_show/id_XMjE4MTUwMTA4.html#paction
http://www.blogjava.net/Metadmin/
http://www.manong5.com/104964246/
http://www.csdn.net/tag/Ralasafe
http://download.csdn.net/search/0/10/0/2/1/ralasafe/1
http://download.csdn.net/detail/wangchaodee/4899826
http://metadmin.iteye.com/
http://www.oschina.net/p/ralasafe/
http://pcedu.pconline.com.cn/empolder/gj/java/0607/835188.html

总结:
问题:给每天数据赋予权限,即数据权限中数据行的问题?(简单来说,就是数据表中的每条数据都可能被不同的人看到,这个场景的赋权问题)

一.关于数据权限,主要有这三个思路:
1.关联表
多对多,存储量太大;查询慢;
pass
2.表结构添加一列,当做拥有该数据权限用户的集合
直接存放用户
用户中存逗号分隔,到时候用in

优化:
1)将用户用编号排列
效果应该并不是很明显,大同小异
2)
A)把每个用户关联一个素数,列中存放素数的乘积
B)还需记录每个用户所拥有的资产权限集合,如用户A拥有数据库、模式、表T1的权限;

最大缺点:在编辑的时候会特别的麻烦,需要先判断每条数据是否有该用户的权限;
pass
4.调研ralasafe
pass
5.Shiro(这两个更多的还是在用户访问权限上的控制,即filter)
pass
6.数据规则,如查看某个人的订单,把这数据操作规则保存起来,然后把这条规则与用户关联,查询时当做where条件,通过sql解决(但在本系统中并不合适)
[更多的只是固定的一些设定好的规则(数量不多)]
即:
【求J2ee数据权限的设计思路,基本要求: 部门经理可以查看该部门下的所有数据对象(比如销售订单),销售人员只可以查看自己的销售订单或者查看其他人的销售订单(通过权限设置),请问该怎么设计?.】
Pass
7.每个用户对应自己的权限集合
优化:A)json
B)xml
C)字符数组(与前端的zTree直接交互,不需处理)
zTree可以通过数组直接生成树,或在权限判断时为已有权限进行打钩;
在具体使用时生成树也比较方便;
D)文件

2次优化:
原先打算在role表中添加一列来存取用户拥有权限的资产集合
但是数据量太大,存到一个列中不方便

何不再建一张表,将资产集合分类,然后将资产的总的名字和其内部的资产权限集合存放到该表中;
然后用户到时候访问该表即可;

权限表(Permission):
集合总id,集合name,集合子集
再加一个用户关联表(relation_user_permission):
Id,集合总id,用户id

3次优化:
到底权限的用途在哪,决定应该到底存哪些信息,或许不应该存那么多信息;
4次优化:
存储时不必挨个去查询列,直接将所有列和关联表一次查询出来,然后循环遍历;
二.访问权限
通过gateWay网关的拦截器来做;
所有微服务的id都会到注册中心进行注册,网关中心gateway会通过相应的映射规则去寻找对应的微服务;(内部微服务之间会通过断路器的方式进行通信)
三.页面实现问题
1.zTree因为数据多而加载太慢的问题?页面加载时先加载数据库、模式和表的信息,然后通过点击的方式展开列;
2.数据量太大,因为跨域问题(get)传不过去?使用iframe传输
不能存放?数据库采用clob字段,每个数据源存放一条数据
3.权限集合应该怎样存放?(取决于权限的用处)
4.用户表的位置?(问题:与jeesite框架兼容的问题,到底用户和角色表应该存在哪个库中?)

解决方案:
在每个数据后面添加一列,存放acl(带查询、修改、增加的权限,参照数据库)
数据库中抽取acl之后会同步到该表中
查询优化:将表join后再查询(hash、),where后面加存储过程函数
修改优化:修改时写存储过程函数,根据相同的权限分隔,然后批量修改;

否定原因:1.数据量过大时过滤会非常的慢,数据本身需要join一次,然后跟权限集合还得join一次;
2.更新一个具体资产类型数据时,需要遍历权限字符串,会非常的慢,因为是后台同步进行的;

数据库全库查询1300万的数据只需要2秒而已;所以查询不是问题;

所以数据量大的情况下,考虑数据库的优化性能,还是不能选集合这种形式;还是添加一列比较快;

数据是默认列有全部权限,但在这边不可用;

发布了74 篇原创文章 · 获赞 31 · 访问量 13万+
展开阅读全文

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 编程工作室 设计师: CSDN官方博客

分享到微信朋友圈

×

扫一扫,手机浏览