`
ronghao
  • 浏览: 449892 次
  • 性别: Icon_minigender_1
  • 来自: 北京
博客专栏
E9473dd5-1985-3883-ac98-962354ca10b3
张小庆,在路上
浏览量:8570
社区版块
存档分类
最新评论

对数据权限控制的实验

阅读更多
一开始我把控制数据权限写在业务里,以订单管理为例,先讨论一个最简单的情况。管理员可以看所有的订单,而用户只能看自己的订单。这里的管理员是一个角色。我会这么写(一些次要代码都省略了):
java 代码
 
  1. List getOrders(String userId){  
  2.           String sql;  
  3.           Role role=orgService.getRoleForUser(userId);  
  4.           if(("admin").equals(role.getName()))  
  5.                 sql="select * from order";  
  6.           else  
  7.                 sql="select * from order where author="+userId;  
  8.           Object o=excuteSql(sql);  
  9.           return excute(o);  
  10.      }  
恩,不错,很好的完成了权限控制。过了没多久,公司发展了,老板增加了人手,老板发话了,我要设置区域管理员分管不同区域的订单。管理员分为北京地区管理员,上海地区管理员,其他地区管理员和总管理员。怎么办?修改代码吧
java 代码
 
  1. List getOrders(String userId){  
  2.             String sql;  
  3.             Role role=orgService.getRoleForUser(userId);  
  4.             if(("admin").equals(role.getName()))  
  5.                  sql="select * from order";  
  6.             else if("bjadmin").equals(role.getName()))  
  7.                         sql="select * from order where area='beijing'";  
  8.             else if("shadmin").equals(role.getName()))  
  9.                         sql="select * from order where area='shanghai'";  
  10.             else if("qtadmin").equals(role.getName()))  
  11.                         sql="select * from order where area='qita'";  
  12.             else  
  13.                   sql="select * from order where author="+userId;  
  14.             Object o=excuteSql(sql);  
  15.             return excute(o);  
  16.        }  
恩恩,这就搞定了,可怎么也感觉不爽,也许该做点什么。一堆if/else权限判断让人心烦,再写个类把这些sql管理起来好了,
那就动手吧
java 代码
 
  1. public class SqlManager{  
  2.         String getSql(String userId){  
  3.                 String sql;  
  4.         Role role=orgService.getRoleForUser(userId);  
  5.         if(("admin").equals(role.getName()))  
  6.             sql="select * from order";  
  7.         else if("bjadmin").equals(role.getName()))  
  8.                 sql="select * from order where area='beijing'";  
  9.         else if("shadmin").equals(role.getName()))  
  10.                 sql="select * from order where area='shanghai'";  
  11.         else if("qtadmin").equals(role.getName()))  
  12.                 sql="select * from order where area='qita'";  
  13.         else  
  14.           sql="select * from order where author="+userId;  
  15.         return sql;  
  16.         }  
  17. }  
这样把权限判断移到SqlManager里,业务代码就清爽了很多,再增加管理员就修改SqlManager好了
java 代码
 
  1. List getOrders(String userId){  
  2.             String sql=sqlManager.getSql(userId);  
  3.             Object o=excuteSql(sql);  
  4.             return excute(o);  
  5.        }  
呵呵,看起来还不错。但是等等,我们的业务方法为什么需要userId这个参数呢,是啊是啊,权限判断用到了它,但是那和我业务又有什么关系呢,不爽。现在AOP不是很流行吗,你不用AOP怎么能说明你技术高呢?快用吧快用吧,用不着也要想着方法用。
业务方法简化为
java 代码
 
  1. List getOrders(){  
  2.             String sql="";  
  3.             Object o=excuteSql(sql);  
  4.             return excute(o);  
  5.        }  
对excuteSql方法我们来AOP一下,注入权限判断过的sql.嘿嘿,技术水平又一次得到了显现。业务方法是幸福了,可我的SqlManager倒是很不幸福。咋办?用个配置文件吧,hibernate不是老鼓励我们把sql写在配置文件里吗?
xml 代码
 
  1. <xml>  
  2.     <sql role="admin">select * from order</sql>  
  3.     <sql role="bjadmin">select * from order where area='beijing'</sql>  
  4.     <sql role="shadmin">select * from order where area='shanghai'</sql>  
  5.     <sql role="qtadmin">select * from order where area='qita'</sql>  
  6.     <sql role="none">select * from order where author=?</sql>  
  7. </xml>  
这样SqlManager就可以把行数缩小了,就可以敏捷一点了。
java 代码
 
  1. public class SqlManager{  
  2.         String getSql(String userId){  
  3.                 String sql;  
  4.          Role role=orgService.getRoleForUser(userId);  
  5.          sql=getSqlfromXml(role.getName());  
  6.          return sql;  
  7.         }  
  8.           
  9.         String getSqlfromXml(String rolename){  
  10.                 ....  
  11.         }  
  12.  }  
以后再增加权限连类都不用修改了,改xml好了。等等,你是不是把问题太简单化了。现在不仅仅是订单,货物也要这么分区域管理。不错,我们应该想着通用一下了。这样,把SqlManager抽象一下
java 代码
 
  1. String abstract getSqlfromXml(String rolename);  
然后做几个子类好了 OrderSqlManager, GoodsSqlManager .
可是,哥们,书上说,要面向接口编程,你这样不太好吧。没事,再接口一下:
java 代码
 
  1. public interface SqlManagerInterface{  
  2.         String getSql(String userId);  
  3. }  
还是没法用啊。也许现在可以看看acegi的provider机制了,把这一大堆SqlManager全部作为provider,根据不同的模块选择不同的provider,统一拦截excuteSql方法,生成不同的sql到数据库执行。xml不爽?db也可以。然后,再然后呢?改你的类名,重构,和acegi整合一下。
呵呵,完全是个人的一些想法,希望多批评提提意见。我想表达的意思是:也许把数据权限再抽象一些,以组件的形式来减少侵入是可以做到的。
分享到:
评论
5 楼 ll123456789 2007-04-09  
可以通过多态方式解决你的问题呀?
4 楼 ronghao 2007-04-04  
Lucas Lee 写道
思路从局部看来还是不错的。
虽然我认为这类数据权限早已经有了比较成熟的实现方法,不是通过什么AOP和XML来搞。
用户的数据权限判断应该是数据驱动的,就是说,给每个用户设置一个关联表,如关联到所属的部门(或特殊一点,叫数据管理部门),每次查询通过一个通过的方法,根据当前用户的部门获得最终的SQL。不需要搞这么复杂。

其实思路就是职责分离,业务类关注自己与权限没有关系,权限部分现在仅仅从我举的例子看是比较简单的,但是如果考虑权限叠加互斥这些关系时,分开就是相当必要的了。你的方法也是要通过一个service根据当前用户的部门获得最终的SQL,我们可不可以把这个service也理解为一个权限service呢?我的方法不过是aop了一下,让业务类感受不到这个service的存在而已,而你是直接调用了
ps:在实际我的实现里,我的sql并不是保存在xml里的,而是在数据库里。更具体一点,是sql条件片段,它们根据逻辑来组装
3 楼 LucasLee 2007-04-04  
思路从局部看来还是不错的。
虽然我认为这类数据权限早已经有了比较成熟的实现方法,不是通过什么AOP和XML来搞。
用户的数据权限判断应该是数据驱动的,就是说,给每个用户设置一个关联表,如关联到所属的部门(或特殊一点,叫数据管理部门),每次查询通过一个通过的方法,根据当前用户的部门获得最终的SQL。不需要搞这么复杂。
2 楼 ronghao 2007-03-24  
liuyxit 写道
兄弟似乎讲重构比讲数据权限控制要多一点啊。

我其实要表述的是:通过acegi的provider机制的扩展是可以实现数据权限的抽象化的。而acegi的provider似乎很多文档都有很详细的说明,所以就把这个给带过了。
1 楼 liuyxit 2007-03-24  
兄弟似乎讲重构比讲数据权限控制要多一点啊。

相关推荐

    实验四 视图、数据控制

    2、数据控制实验 ① 假定系统有U1、U2、U3 、U4、U5、U6六个登录用户,试将查询图书表的权限由管理员授权给U1, 以U1用户的身份重新登录系统后,再把权限授予给U2; ② 系统管理员把插入数据给借阅表的权限授予给...

    实验四视图、数据控制与嵌入式SQL语言实验

    2、数据控制实验 ① 假定系统有U1、U2、U3 、U4、U5、U6六个登录用户,试将查询图书表的权限由管理员授权给U1, 以U1用户的身份重新登录系统后,再把权限授予给U2; ② 系统管理员把插入数据给借阅表的权限授予给U3...

    sql的数据控制语言及数据库的保护(实验)

    实验主要内容及方法 数据控制语言,与用户、权限管理 实验要求: (1) 掌握用户的创建,删除,权限的授予、收回。 (2)掌握数据库的备份和还原。 实验目的:熟练掌握授权与撤权。 实验设备:装有SQL SERVER 2000的...

    实验三 数据库的安全性和完整性控制.doc

    实验三 数据库的安全性和完整性控制 (1)通过本实验能够熟练应用sql语言进行用户权限的授予和回收。 (2) 熟练掌握实体完整性,参照完整性及用户定义的完整性的定义。 (3)体会oracle数据库系统在安全性和完整性...

    数据库系统概论数据库安全性实验报告.doc

    含有报告和代码 一、实验目的 熟悉通过SQL对数据进行安全性控制。 二、实验内容和要求 1、熟练grant,revoke语句进行DAC控制 2、通过创建角色以及授权实验,了解并掌握SQL Server权限控制过程。

    数据库安全性与完整性实验

     数据库的安全性实验,在SQL Server企业管理器中,设置SQL Server的安全认证模式,实现对SQL Server的用户和角色管理,设置和管理数据操作权限。  具体内容如下:  设置SQL Server的安全认证模式(Windows或SQL ...

    Oracle数据库实验操作

    实验15:操作数据为null的函数 31 实验16:分支的函数 32 实验17:分组统计函数 33 实验18:表的连接查询 36 实验19:sql99规则的表连接操作 40 实验20:子查询 41 DDL和DML语句 45 实验21:建立简单的表,并对表进行...

    java实验报告 四个访问权限,抽象数据类型栈,计算器

    编写四个类A、B、C、D,其中类A、B在同一个包中,类C、D在另一个包中,且类C为类A的子类,通过这四个类来测试private,protected,public和friendly四个访问权限的区别。实现栈的基本操作。实现计算器。

    中南大学大型数据库技术实验一、二

    为每个学生建立相关用户,实现权限控制,每个学生可查询自己的信息,班长可查询本班所有学生信息; 为每个专业负责建立用户,每个专业负责可查询本专业所有学生信息。 实验二:设计与建立上课考勤表Attend_???。建立...

    数据库原理实验4-数据的安全性与完整性控制(实验报告含总结体会、代码)

    1 实验目的 (1) 掌握用户管理的基本方法,包括创建登录、创建用户、删除用户和设置用户密码。 (2) 掌握用户授权和回收权限的基本方法。 (3) 掌握系统级权限和对象级权限的授权和回收方法 (4) 掌握角色的使用...

    数据库实验报告 SQL语言的DCL (详细版 含有截图的)

    本次实验了解DCL语言的GRANT和REVOKE语句对数据库存取权限的控制,学会SQL Server 2000的查询分析器中用DCL语言对数据库存取权限进行设定。 本实验需要2学时。 二、实验内容 1.创建新的数据库用户 2.用GRANT语句对...

    论文研究-基于Android权限机制的动态隐私保护模型.pdf

    通过对Android应用程序权限进行细粒度的动态配置, 阻断隐私数据从程序内部泄露的途径, 利用隐私数据着色跟踪实现对程序间传播的包含不同隐私权限标签的消息的隔离控制。通过大量实验的反复测试, 该模型可以有效保护...

    实验四 SQL语言的DML,DDL和DCL初步

    本次实验了解DML语言的INSERT、UPDATE、DELETE对数据的操作,学会SQL Server的查询分析器中用DML语言对表中的数据进行插入、删除和修改。了解DDL语言的CREATE、DROP、ALTER对视图的操作,学会SQL Server的查询分析器...

    工控安全职业证书技能实践:工控网络数据安全审计权限配置及实战.docx

    工控网络数据安全审计权限配置及实战 课程级别 信息安全专业工业互联网安全方向。 实验概述 此实验主要内容是掌握windows sever 2003操作系统的安全审计配置,掌握安全审计权限配置的基本方法。 实验目标 掌握如何...

    oracle实验报告

    在块中对数据库查询,增、删、改等对数据的操作是由SQL命令完成的。在PL/SQL块中,可以使用SQL的数据查询命令,数据操纵命令和事务控制命令。可使用全部SQL函数。PL/SQL中的SQL语句,可使用SQL的比较操作等运算符...

    NTFS权限设置

    特殊权限:“遍历文件夹”权限,“运行文件”权限,“列出文件夹”权限,“读取数据”权限,“读取属性”,“读取扩展属性”,“创建文件”权限,“写入数据”权限,“创建文件夹”权限,“附加数据”权限,“写入...

    数据库实验 数据库的安全性控制

    • 理解数据库的安全性保护 • 掌握SQL Server 中有关用户登录认证以及管理...• 熟练掌握T-SQL 的数据控制语言,能通过自主存取控制进行权限管理 • 熟悉SQL Server 中角色管理 • 熟悉视图机制在自主存取控制上的应用

    数据库实验报告

    实验目的:掌握数据表建立、修改、删除、索引的SQL语句。 实验内容: (1)数据表的建立 (2)数据表的修改 (3)数据表的删除 (4)数据表的索引建立 为S表的DEPT建立唯一索引 (5)视图的建立与删除 建立一个...

    人工智能-项目实践-信息检索-信息检索实验:企业搜索系统的设计与实现

    信息检索实验:企业搜索系统的设计与实现 2 实验内容 ...检索条件控制:对检索条件加以限制,仅在用户访问权限内的文档中检索。 检索结果过滤:检索结果的后处理,过滤掉用户不具备访问权限的结果。

    基于SSM+mysql的实验室管理系统设计与实现(源码+设计文档+部署说明+视频演示).zip

    总之,基于SSM+MySQL的实验室管理系统具有技术稳定性高、用户管理、实验室资源管理、预约与借用管理、设备维护与报修、实验室日程管理、数据分析与统计、通知与消息提醒、数据安全与权限控制等特点,能够为实验室...

Global site tag (gtag.js) - Google Analytics