波斯码BOSSMA Information Technology

细粒度数据权限控制的探索(2)

发布时间:2010年7月22日 / 分类:ASP.NET / 次浏览 / 评论

在上一篇文章中,一步步的深入的探讨了数据权限控制的方式;这一篇文章将搭建一个可以灵活控制数据权限的框架。

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语句。

当然这个数据访问的基类是早已定义好的,编程人员不会接触到,在实际的开发过程中,编程人员只要继承这个基类,按照约定的方式调用基类的相关方法,数据权限就会自动注入了,如下:

这样就实现了数据权限控制的灵活控制。

当然这里边会有很多的细节,这里只是介绍了一下思路,供大家参考。

本博客所有文章如无特别注明均为原创。
复制或转载请以超链接形式注明转自波斯码,原文地址《细粒度数据权限控制的探索(2)

关键字:

建议订阅本站,及时阅读最新文章!
【上一篇】 【下一篇】

目前有4 条评论

  1. jackyrong 地板:

    不是很明白你是如何注入SQL的?我目前的想法是,求出当前登录用户拥有的角色(分组),因为我这边比如某个资源列表,对不同角色(分组),能看到的数据范围是不同的;我是定义了一个表:
    role rule
    运维部 where a>1000
    市场部 where b<1000
    那么我想法是得出当前用户所在的角色(部门,分组)等,然后根据这个表,找出对应的SQL条件,但如何实现你说的注入SQL?

    • @jackyrong
      实现文中所说的SQL注入,需要分析SQL语句的语法,找到条件部分,添加额外的条件。分析SQL语句可以用正则或者根据SQL关键词查找或者两则配合使用。

  2. bossma 板凳:

    @旭日升
    1、多选框的作用是 设置权限的时候可以选择多个有效值。
    2、通过为分组设置某个字段关联的数据资源。
    3、这个没明白,最终的权限控制是向sql语句注入相关条件实现的。

    还有不明白的,欢迎继续交流。

  3. 旭日升 沙发:

    您好,很高兴能看到这么好的文章!
    我现在也正在实现关于数据权限控制的问题,我觉得你的方案是可行性比较高的,但是遇到了一些问题,希望能给予解答,谢谢!
    1.在绑定数据资源的时候,多选框是什么意思
    2.数据源生成的字段是如何进行绑定到权限组的
    3.生成的条件如何应用到所有自定义的模块中

发表评论