读书人

小弟我对项目可能存在的权限需求的分类

发布时间: 2012-11-06 14:07:00 作者: rapoo

我对项目可能存在的权限需求的分类
很早就完成了权限系统的编码,在实现过程中对可能存在的权限需求进行了分类,也希望提提意见。
一是系统权限,主要是对模块为单位的权限划分,具体就是用户对该模块可见不可见,能不能对该模块进行再授权的操作。表现在用户界面就是用户登录系统主页面后,可以看到的顶部菜单和左侧outlookbar菜单的内容控制。它是粒度最大的权限控制。
二是模块操作权限,在对整个模块的权限做出控制后,这里继续对模块的浏览、增加,修改,删除的操作权限做出控制,也可以理解为对象权限 。还是以车辆管理为例,不同的人员对这个模块的操作是不同的,有些用户可以新增,删除车辆;而有些用户则只是可以对车辆的情况查看不能修改。
三是数据范围权限,又可以叫做对象实例级权限。事实上不是每个用户都可以看到所有记录的。以财务管理为例,部门经理只能查看金额小于1W的数据;而总经理则没有限制。数据根据其类型,相应字段数值范围划分为不同的区域。不同的人拥有不同的区域查看权限。
四是单条数据ACL权限,具体说就是对每条数据都要实现权限控制,每条数据都有一到多条权限数据与其对应。以个人通讯录为例,每个用户都维护自己的一个通讯录,这些数据都只是对本人可见,其他人不可见。但用户可以对这些数据做出授权,将某条联系方式以授权的方式共享给其他人,并赋予不同的权限,包括拥有,修改,删除,浏览四种权限。
五是数据字段权限,这也是用户的最小粒度的权限控制。每条业务数据权限可以精确控制到每一个字段。包括单个字段的可否浏览以及可否修改。
六是数据范围操作权限,其实这个是可以和数据范围权限合为一个的。具体的区别在与对已经划分范围的数据再增加操作的权限控制。还是以财务管理为例,部门经理只能查看金额小于1W的数据;而总经理则没有限制,可以查看所有数据。但是请注意:他们只能对这些数据拥有查看的权限,不能修改或是删除,而财务则拥有修改的权限。在一些情况下可以用模块操作权限和数据范围权限的叠加来满足对该权限的需求,但是在权限复杂的情况下,这个权限独立出来是必须的。

你描述的这些部分已经都实现了,我主要想要知道的是你如何看待或是解决我下面说的硬伤部分(主要是针对特定的接口实现特定的hql片断同直接把数据权限当作业务逻辑的一部分有什么区别呢?除了留下来一个看上去很美的统一管理的途径)。
16 楼 ronghao 2007-03-21 dada 写道

每个需要控制权限的接口为了权限都在数据库中实现了特定的hql片断以供修改hql语句。乍看之下整个系统的权限是实现了七七八八了,但是有以下几个硬伤:
1.如果某个接口的实现方法改变(特指hql发生了改变),可能需要去数据库修改权限对应的hql片断,开发人员很不方便。
2.虽然由数据库维护了权限的控制,但是事实上这块的权限和业务高度耦合,不能指望维护人员能够修改什么,甚至开发人员自己来维护的时候也异常麻烦。

为什么需要去数据库修改权限对应的hql片断呢?不能动态修改吗?我刚才也提到了一个大的抽象的资源类,它的作用就是把这些hql片断重新以某种方式组合,同时它的另外一个作用就是实现权限和业务的解耦,它上面可以再增加一个接口,可能是这样一个方法 QueryObject getAuthQueryObject(Principal p);传入当前用户信息,返回他有权限的资源(这里是重新组织过的HQL),然后你AOP业务方法,前拦截把这个QueryObject处理到你的业务hql中去 17 楼 ronghao 2007-03-21 我大概明白你的意思了,这些HQL片段有些是对应这个业务接口的,比如说用户信息管理对应一些HQL片段,财务信息管理又对应另外一些HQL片段,是这个意思吗? 18 楼 dada 2007-03-21 ronghao 写道我大概明白你的意思了,这些HQL片段有些是对应这个业务接口的,比如说用户信息管理对应一些HQL片段,财务信息管理又对应另外一些HQL片段,是这个意思吗?
确实如此,无法抽出共有的部分。我只是描述了项目的一个方面,其实还有很多方面需要这样控制的。 19 楼 ronghao 2007-03-21 这个你可以考虑给这些hql片段加个标识字段,标识这几个HQL片段是和那些业务挂钩的。在我的实现中是给它们增加了个domain classname.我想这应该不是难事,你可以单独出一个xml来配置这个东西,如果你实现页面配置到数据库中比较麻烦的话 20 楼 ronghao 2007-03-21 dearwolf 写道acegi做ACL的支持现在已经很方便了么?
http://www.iteye.com/my_topic/63047 21 楼 dada 2007-03-21 ronghao 写道这个你可以考虑给这些hql片段加个标识字段,标识这几个HQL片段是和那些业务挂钩的。在我的实现中是给它们增加了个domain classname.我想这应该不是难事,你可以单独出一个xml来配置这个东西,如果你实现页面配置到数据库中比较麻烦的话
事实上有类似的标示,但是控制的地方太多了,造成了混乱。

我这里举另外一个曾经的项目来做例子吧,那个项目的权限比较简单,只需要根据分公司和使用人员的职位来过滤数据。hibernate filter能够很好的满足这个需求,俺希望现在这个系统可以趋向于这种入口简单,修改也简单的方式。

读书人网 >软件架构设计

热点推荐