在软件系统中,权限指的是系统用户对系统对象的执行某个操作的权限。
一、权限受哪些因素影响
图1 对象权限相关的因素从权限的定义可以知道,权限与系统用户、系统对象有关,一般情况下系统用户不直接与权限发生关联,而是通过角色来间接关联。权限的相关因素可能有:
1. 角色授权(权限表)
例如用户A授予角色B对系统对象C的读权限。
2. 特殊角色(如管理员)对某些系统对象的类别有特殊的权限
例如系统管理员对系统中所有的对象都有全部权限。有时候不是所有的对象,而是某个类别的对象,如用户管理员对用户对象有全部权限,但对别的对象并没有什么特殊的权限。
3. 系统对象的内部状态或属性
例如文件的所有者对该文件有全部权限、文件被某个用户锁定编辑的时候仅该用户有修改的权限。
二、权限机制的实现
图2系统对象部分的类图在系统对象部分,主要是处理与系统对象关系较为密切的权限判断,如权限表(不同的系统对象可能有不同的权限表,所以放在这里处理比放在角色部分好),还有一些与系统内部状态或属性相关的权限检查(因为不同的系统对象与权限相关的内部状态和属性都可能不一样,所以应该在这里处理。如果是比较通用的权限检查,例如检查系统对象与角色的Owner关系,则可以作为一个外部PermissionCheck类;如果是专用的或者是对系统不公开的内部状态或属性的权限检查,可以考虑作为内部类)。这里的PermissionCheck是采用策略模式来处理权限问题,这里的权限机制没有强制要求一定要采用该模式,系统对象完全可以不依赖任何PermissionCheck来处理权限。使用PermissionCheck的好处是简化系统对象,还可以实现一些通用的PermissionCheck以达到重用的目的,PermissionTable也是PermissionCheck的一个实现,基本上可以在所有系统对象中使用。
图3 角色部分的类图角色部分的权限机制是基于以下几点:一是对系统对象的权限分配是基于角色的;二是每个系统用户都对应一个相应的专有的角色(这种角色可以不参与授权,但在权限检查时代表该用户,以便系统对象判断自身与该系统用户的关系)。系统用户在这里的主要职责是找到自己属于哪些角色,并请求这些角色判断对系统对象的权限,并将这些权限组合。由于企业组织结构图的复杂性和易变性,将这个组合角色权限的职责放在角色部分比放在系统对象部分要好一些,一旦企业组织结构图发生变化,不会影响到系统对象部分(另外有的系统对用户分类为只读和正常两类,组合权限也必须考虑这个,也是放在系统用户里处理比较合理)。每个角色除了要请求系统对象判断权限外,还要处理与角色相关的特殊权限,例如系统管理员角色、文档管理员角色等。
图4显示了一个检查系统用户user对系统对象systemObject是否有权限类型为permissionType的权限的协作图。
图4 检查权限的协作图