最近项目中需要设计一个权限系统,收集了一下资料,权限系统主要有两种技术:ACL(Access Control List)和RBAC(Role-Based Access Control)。前者是将用户直接和权限关联,并通过Group来组织这些用户,windows 系统的用户权限就应该属于这一种(有待确认)。后者通过角色将用户和权限隔离开来,对角色赋予权限,而一个用户就一种角色的一个实例。
ACL的优点是能够直接针对用户进行权限设置,权限设置较为灵活,每个用户都可以完全不同,但是这也增加了管理员设置权限的复杂性。RBAC更便于用户的管理。对于两者的详述和比较在不在此啰嗦,网上有很多相关资料。
下面就说我做的事情。
设计需求:
1. 以项目为单位的权限控制;
2. 项目分为不同的小组,比如仪表组、DCS组等,每个组所使用的系统模块不同;
3. 每个小组下面又有不同岗位,比如仪表选型、样本维护等。不同岗位的人员,对该小组对应的系统模块下的不同功能的使用权限不同。
第2对应RBAC的Group,第3对应RABC的Role,这一部分画出了如下的数据库ER图。
这中结构就是通常介绍RBAC的通用结构,比较容易理解。从ER图中可以看出,权限分配是以角色为单位,这是RBAC的最主要的特点。同时,从很多资料中看到,RBAC一般只做到功能级别的权限控制,而对于更加细粒度的数据控制很难实现,比如细化到行数据,甚至是字段的操作权限控制。
下面的这些需求就是让我纠结了很久。
1. 对于同一岗位(角色)的不同人员(角色实例),能够查询该岗位的所有人员创建的数据,但是只能够修改或删除自己所创建的数据;
2. 对于非自己所创建的数据,只能访问该数据的部分字段。
其实,第1条就是基于行数据的访问控制,第2条就是基于字段的访问控制。为了满足这两项,添加了三张数据表,形成了下面的ER图。
“权限类别”数据表相当于一个枚举变量,包括 项目、组、角色、个人四个值,比如一项“样本维护-删除-样本”(角色-操作-功能)的操作权限的权限类别属于“个人”,那么一行样本数据只能够由该数据的创建者删除;如果数据“角色”,那么该数据可以由所有的样本维护角色的人员来删除。这样,就可以满足第1条需求了。
上述仅为自己做这个权限设计的初始想法,还未验证,也未进行编码,欢迎各位拍砖!