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

对数据权限控制的实验

阅读更多
一开始我把控制数据权限写在业务里,以订单管理为例,先讨论一个最简单的情况。管理员可以看所有的订单,而用户只能看自己的订单。这里的管理员是一个角色。我会这么写(一些次要代码都省略了):
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  
兄弟似乎讲重构比讲数据权限控制要多一点啊。

相关推荐

    实验四 视图、数据控制

    **数据控制实验**: 1. 使用GRANT和REVOKE语句管理用户的权限。 2. 验证权限分配和回收的效果。 **嵌入式SQL实验**: 1. 使用Visual Basic 6.0创建工程并添加控件。 2. 编写代码连接数据库并执行SQL查询。 3. 显示...

    数据库视图和数据控制实验报告

    3. 数据控制实验涉及数据库的权限管理,这是数据库安全的重要组成部分。实验中,管理员首先创建了新用户U1,赋予了查询图书表的权限。接着,管理员以U1身份登录,进一步将权限授予用户U2,这样U2也能查询图书表。...

    实验三 数据安全性控制

    本实验主要聚焦于通过SQL语言来实现对数据的安全性控制,以及如何设计数据库的完整性,以保证数据的准确性和一致性。 一、实验目的 1. **熟悉SQL数据安全性控制**:学习如何使用SQL语句设置用户权限,包括GRANT、...

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

    实验四主要涵盖三个主题:视图定义与查询、数据控制以及嵌入式SQL语言实验,所有操作都在SQL Server 2000查询分析器中进行,基于“图书读者数据库”(Book_Reader_DB)和实验二输入的数据。 1、视图定义与查询: -...

    数据运维 实验3 数据库安全性与完整性控制实验.pdf

    1. 数据库安全性与完整性控制实验概念: 数据运维实验通常包括数据库安全性和完整性控制的实践操作。安全性的目的是保护数据不被未授权的用户访问或篡改,而完整性则保证数据的准确性和一致性。MySQL数据库管理系统...

    数据库实验3报告(数据完整性与安全性控制).docx

    【数据库实验3报告——数据完整性与安全性控制】 本次实验主要涉及了数据库中关于数据完整性和安全性的关键概念和操作,具体包括数据约束的设定、表的创建与删除、权限的管理等多个方面。以下是对实验内容的详细...

    实验四数据安全控制.docx

    数据安全控制实验四是一份详细的实验指导,旨在帮助学生熟练掌握SQL SERVER数据库中视图的创立、修改与删除,并掌握用户和角色的创立、修改与删除,最后实现对表和视图的访问权限控制。 一、实验目的: 实验四的...

    国家开放大学 数据库运维 形考3 数据库安全性与完整性控制实验

    数据库安全性与完整性控制实验 本实验的主要目的是练习安全性授权方法、安全性和完整性查看的操作方法。实验内容涵盖了创建用户、赋予权限、查看权限信息等多方面的数据库安全性和完整性控制。 一、创建用户 在...

    实验3 数据控制(安全性部分).docx

    数据库系统概论实验报告实验 3 数据控制(安全性部分) 本实验报告的主要目的是为了学习数据库系统的安全性控制,...实验的结果表明,数据库系统的安全性控制是非常重要的,需要通过授权和权限管理来确保数据的安全。

    数据库视图与数据控制实验

    在数据控制实验部分,我们模拟了六个不同的用户角色(U1到U6),并进行了一系列权限操作。管理员首先将查询图书表的权限授予U1,然后U1以自己的身份登录并将此权限转授给U2。接着,U3被赋予插入借阅表数据的权限,U4...

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

    实验四的目的是让学生熟悉SQL Server 2000中的数据控制语言(Data Control Language, DCL)以及数据库的保护机制,主要包括用户管理、权限管理和数据库的备份与还原。以下是相关知识点的详细说明: **用户管理** 1....

    实验3 数据库安全性与完整性控制实验.doc

    这个实验综合了数据库用户管理、权限控制、表结构设计和完整性约束的重要概念,对于理解数据库系统的安全性和数据完整性具有重要意义。通过这些实践操作,学生能够掌握如何在实际环境中确保数据的安全性和一致性。

    filter 实现权限控制

    通过以上步骤,我们可以实现一个基于RBAC的权限控制系统,利用`Filter`对用户请求进行拦截,确保只有拥有相应角色的用户才能访问特定的页面或功能。这种方式既提高了系统的安全性,也简化了权限管理的复杂度。 在...

    信息安全技术:Linux文件权限管理实验.doc

    在多用户环境中,每个用户对文件和目录的访问都受到严格的控制,这正是Linux权限系统的核心功能。 实验内容详细介绍了Linux文件权限的表示方式,包括字符串表示(如"rwx")和数字表示(如"755")。在Linux中,文件...

    访问控制实验报告2.pdf

    这需要建立主体和客体之间的关系,对不同主体分配不同的访问权限,并由系统根据这些权限控制对文件资源的访问。实现时,需要定义相关的数据结构,如用户表、资源表和权限表等。 知识点八:实验环境搭建 在实验报告...

    arcgis之arcview实验数据

    同时,理解数据的权限管理和版本控制也是很重要的实践环节。 通过这个"arcview实验数据",你可以全面了解和掌握ArcView的基本操作,提升地理信息处理能力。在实践中不断探索和尝试,你将能更好地运用ArcGIS工具解决...

    DACPCC:一种包含访问权限的云计算数据访问控制方案.pdf

    - **权限控制密钥**:在DACPCC方案中,数据所有者通过控制权限控制密钥来实现对数据访问权限的细粒度管理。 - **安全性证明**:文章通过理论上证明了DACPCC的安全性,包括数据的保密性和系统不受攻击的安全性。 - ...

    数据库安全控制实验报告

    【数据库安全控制实验报告】 本实验报告主要探讨了数据库的安全性控制,特别是在SQL Server环境下如何实现用户登录认证、权限管理和存取控制。实验目的是让学生理解并掌握数据库安全的基础概念和操作,包括SQL ...

    数据库原理实验报告-实验三-数据完整性与安全性控制.docx

    例如,访问控制可以限制用户对数据库的访问权限,身份验证可以确保用户的身份, 加密可以保护数据的机密性,权限控制可以确保用户对数据库的操作权限。 在实验报告中,学生需要使用图形用户界面和SQL语言来创建、...

    计算机安全课程访问控制实验代码及报告

    在这个“计算机安全课程访问控制实验”中,我们将探讨访问控制的不同模型,包括强制访问控制(MAC)、自主访问控制(DAC)和基于角色的访问控制(RBAC),以及如何在实际场景中实施这些模型。 首先,强制访问控制是...

Global site tag (gtag.js) - Google Analytics