在上一篇文章中,一步步的深入的探讨了数据权限控制的方式;这一篇文章将搭建一个可以灵活控制数据权限的框架。
1、目标
(1)编程人员很少甚至无需关注数据权限
(2)数据权限由实施人员或用户直接来设置
(3)不通过编码而只需要在友好的界面中更改设置
2、分析
为了使编程人员忽略数据权限的问题,必须使用某种方法在程序的某个执行过程中注入数据权限的控制。网上有一些文章介绍通过AOP来解决数据权限的控制问题,个人觉得流于理论方面的介绍(或者没理解其中真谛),在实际的应用中比较难于实现,或者不具有实际应用的性价比。
既然是对数据权限的控制,因为所有的数据的获取都需要通过SQL语句(也许不是所有的,这里假设前提如此),那么如果能够实现对SQL语句的注入(不是搞破坏,正好相反),将数据权限的条件语句注入到SQL语句中,这样就从系统底层上实现了读数据权限的控制;此时编程人员只需要正常的编写自己的查询、更新、删除语句,无需写专门的数据权限控制,SQL语句执行之前会自动注入数据权限的相关条件。
那么这些数据权限在什么地方配置呢?数据权限的控制更接近于应用的业务成面,所以可以让实施人员或者用户直接来配置(需要客户了解一些数据库的知识),首先需要对系统的用户进行分组,不同的分组应用不同的数据权限,比如:对某个分组的客户信息的权限控制,有一个界面,可以输入:
表名称.字段名称 = 某个地区
这样在数据权限控制的底层,我们可以读取当前用户所在分组的数据权限,并根据表的名称,对相关的SQL语句进行注入。
如果以后要修改分组的数据权限,只需要在界面中重新配置就可以了,无需编程人员编码修改。
当然灵活的控制总会增加系统运行中资源的耗费,对系统的性能造成一定的影响,本人没有对这个性能的影响程度做进一步的探究。
3、实现
(1)数据资源的定义
定义可以进行数据权限控制的资源,这里指数据表、字段以及字段的输入来源情况。
在这里创建了一个数据资源,Customer表中的ID字段,并且设置了ID字段的值如果获取。
(2)分组管理
分组管理可以设置分组的人员,分组的数据权限。
分组人员设置
分组数据权限设置(点击打开大图)
可以添加定义好的数据资源,设置字段的关联方式,选择或输入要关联的值,并且可以定义权限类型:浏览、更新、删除。
很方便的调整分组的数据权限。
(3)底层实现
定义一个数据访问的基类(SQLDAL),在其中注入数据权限控制:
提供两个方法,InjectSQL用于注入SQL语句;InjectConditon用于将指定表的指定权限类型注入查询条件(strWhere)中。
权限类型会对不同类型的SQL语句进行注入,这里不再详细说明。
然后在具体的执行方法中,调用上边的注入方法,最后执行SQL语句。
当然这个数据访问的基类是早已定义好的,编程人员不会接触到,在实际的开发过程中,编程人员只要继承这个基类,按照约定的方式调用基类的相关方法,数据权限就会自动注入了,如下:
这样就实现了数据权限控制的灵活控制。
当然这里边会有很多的细节,这里只是介绍了一下思路,供大家参考。
不是很明白你是如何注入SQL的?我目前的想法是,求出当前登录用户拥有的角色(分组),因为我这边比如某个资源列表,对不同角色(分组),能看到的数据范围是不同的;我是定义了一个表:
role rule
运维部 where a>1000
市场部 where b<1000
那么我想法是得出当前用户所在的角色(部门,分组)等,然后根据这个表,找出对应的SQL条件,但如何实现你说的注入SQL?
@jackyrong
实现文中所说的SQL注入,需要分析SQL语句的语法,找到条件部分,添加额外的条件。分析SQL语句可以用正则或者根据SQL关键词查找或者两则配合使用。
@旭日升
1、多选框的作用是 设置权限的时候可以选择多个有效值。
2、通过为分组设置某个字段关联的数据资源。
3、这个没明白,最终的权限控制是向sql语句注入相关条件实现的。
还有不明白的,欢迎继续交流。
您好,很高兴能看到这么好的文章!
我现在也正在实现关于数据权限控制的问题,我觉得你的方案是可行性比较高的,但是遇到了一些问题,希望能给予解答,谢谢!
1.在绑定数据资源的时候,多选框是什么意思
2.数据源生成的字段是如何进行绑定到权限组的
3.生成的条件如何应用到所有自定义的模块中
发表评论
相关文章
国内AI资源汇总,AI聊天、AI绘画、AI写作、AI视频、AI设计、AI编程、AI音乐等,国内顺畅访问,无需科学上网。
扫码或点击进入:萤火AI大全
文章分类
最新评论