关于权限系统设计的一些问与答

一个朋友留言,提了一些关心的问题,这里说说自己的想法(不一定对)。

问题:数据范围的控制:“事实上不是每个用户都可以看到所有记录的。以财务管理为例,部门经理只能查看金额小于1W的数据;而总经理则没有限制”。象这样要根据数据的某个字段对数据范围进行控制,应该实现呢,是通过AOP动态改变执行的SQL吗?这样似乎不太可行,如果要执行的SQL特别复杂,那动态改变SQL就更难了。现在的应用中一般使用hibernate,这样的话就变成了动态改变HQL,也是难的。

回答:目前在我的代码里就是通过AOP动态改变执行的SQL,改变HQL确实很困难,但是改变criteria就比较简单了。对于特别复杂的sql,我的建议是把这些SQL直接写到你的业务程序里去,或者单独配置出来,和ibatis比较类似。

问题:单条数据ACL权限:由于数据是不断增加的,所以要对单条数据的ACL权限,不应该是数据已存在,然后再对存在的数据授权,应该是对某种规则进行授权。以你举的个人通讯录为例,各人自己维护自己的通讯记录,数据只对自己可见,要想实现对自己的数据的可再授权,应该是对符合某个规则的数据进行授权,也就是说“要执行授权操作的人就是数据的拥有者”这是个规则,那是不是应该对这个规则授权呢。

回答:我理解的和你不一样。我的理解是这样的,实际中我把单条数据的权限划分为拥有、浏览、修改、删除四种权限,用户拥有哪种权限就可以对数据进行相应哪种操作。“要执行授权操作的人就是数据的拥有者”也可以理解为“要执行授权操作的人就必须有该数据的拥有权限”,这可以理解为一种规则,但我更愿意把它理解为一种习惯,很显然对习惯授权是没有意义的。当然这里是存在规则的,这种规则简单的说是这样:当我新增一条数据时,哪些人对该条数据拥有拥有的权限,哪些人对该条数据拥有浏览的权限,哪些人对该条数据拥有修改的权限,哪些人对该条数据拥有删除的权限。权限相关记录会在新增这条数据时根据该规则生成。在上面的例子里,这一规则体现在:各人自己维护自己的通讯记录,数据只对自己可见。也就是说在用户新增自己的通讯记录时,系统同时往权限表里插入了该用户对该记录的一个拥有权限记录。

问题:数据字段权限:要实现对某个字段的权限控制,那是不是应该所有字段应该有个默认的操作呢,或者默认就是只可以查看,要进行修改的话就必须授权。但是通常整个应用中的字段非常多,这样是乎不太合理。那是不是可以做成所有字段默认就是可以CRUD的,只有要控制的字段才进行权限判断。同样,由于使用Hibernate来进行持久化,那对字段的控制是不是就变成了对类中属性的控制。

回答:数据字段权限一直是一个很难办的事情,实际上我很倾向于把这个问题推到页面来解决。其实所有的权限控制最后都是要通过页面来表现的。其实对字段来说,所需要的权限也很简单:可见/不可见,只读/可修改。这样的话,通过标签的形式来控制字段的显示、只读就显得很自然。对字段的权限记录可以放入到数据库,或者xml中,与具体的pojo类没有关系,当渲染页面的时候,由标签来读取相关权限记录并控制显示。

问题:角色权限的继承:角色权限的继承通过规则来做,这个规则应该怎么设计呢。

回答:这个问题其实是一个分离关注点的问题。你可以抽象出一个规则接口,这个接口定义了对部门、角色下的用户而言,哪些权限是可以从部门角色继承的,继承几级,哪些是不可以的。然后再具体实现。更灵活的方式是定义出一个配置文件,运行时可以灵活修改。

相关推荐