由于资源访问方式枚举量的定义各不相同,如何以统一的接口方式获取不同资源的访问方式是本平台设计的一个难点。这里采用属性AccessType统一返回资源访问方式枚举量的类型(Type)对象。通过下列代码可以得到访问方式枚举量的所有信息(C#):
Type t =resourceNode.AccessModeType;
FieldInfo[] fs=t.GetFields(BindingFlags.DeclaredOnly|
Binding Flags.Static|BindingFlags.Public);
int[] enumVals =new int[fs.Length];
string[] enumNames= new string[fs.Length];
int i =0;
foreach(FieldInfo f in fs)
{
enumVals[i]=f.GetValue(null);
DisNameAttribute[] ds=f.GetCustomAttribute(typeof(DisNameAttribute),false);
If(ds.Length != 0)
enumNames[I]=ds[0].Name;
}
上述代码中,enumVals数组中存储了所有访问方式的枚举值,enumNames数据组中存储了各个访问方式的显示用名称。
权限是指用户对具体资源的访问许可,权限和资源密不可分。这里权限用一个二元组来表示:
Permission(Resource,AccessMode)
其中Resource表示一个具体资源,AccessMode是用户对此资源的所授权的访问方式。需注意的是,由于AccessMode设计成可按位组合,所以此二元组表示了用户对一个资源的所有访问权限。
3.4 角色角色可由系统管理员或授权用户灵活定制。角色具有唯一且不重用的ID。
3.4.1 角色的组织角色之间采用组合关系,一个角色可以包含其它多个角色,一个角色的权限是它本身及其所包含的其它角色所拥有的权限的集合。
Role_Table
|
字段 |
类型 |
描述 |
|
ID |
int |
主键 |
|
Name |
string |
名称 |
|
Status |
int |
状态 |
|
… |
… |
… |
角色的所有相关信息均记录到数据库中的角色表Role_Table。
3.5 角色的权限分配权限分配是指为角色配置某种权限。可以用三元组(Role,Resource,AccessMode)表示,即Role角色对Resource资源可以进行AccessMode的操作。
3.5.1 角色权限关联表RolePermission_Table
|
字段 |
类型 |
描述 |
|
RoleID |
int |
外键 |
|
ResourceID |
Int64 |
外键 |
|
AccessMode |
int |
访问方式 |
|
… |
… |
… |
角色的所有授权信息均存储到角色权限关联表RolePerssion_Table。
3.6 用户用户可由系统管理员或授权用户灵活增删。用户具有唯一且不重用的ID。
3.6.1 用户的组织各个用户相互独立,不存在继承或组合关系。
3.6.2 用户表User_Table
|
字段 |
类型 |
描述 |
|
ID |
int |
主键 |
|
Name |
string |
名称 |
|
Password |
string |
加密口令 |
|
Status |
int |
状态 |
|
… |
… |
… |
用户的所有相关信息均记录到数据库中的用户表User_Table。
3.7 用户的角色委派角色委派是指为用户分配若干种角色。可以用二元组(User,Role)表示,含义是User用户属于角色Role。一个用户可以属于多个角色。
3.7.1 用户角色关联表UserRole_Table
|
字段 |
类型 |
描述 |
|
Role_ID |
int |
外键 |
|
User_ID |
int |
外键 |
|
Status |
int |
状态 |
|
… |
… |
… |
用户与角色的所有关联信息均记录到数据库的用户角色关联表UserRole_Table。
4 系统运行模型使用应用系统的用户首先要进行用户登录,登录成功后,结合UserRole_Table及RolePerssion_Table查询当前用户对所有资源的访问权限,根据返回结果在动态生成此用户对资源的所有权限表:
UserPermission_Table
|
字段 |
类型 |
描述 |
|
ResourceID |
int64 |
资源 |
|
AccessMode |
int |
访问方式 |
|
… |
… |
… |
其中AccessMode的值是用户所属的多个角色对某一资源的所有访问方式的组合。
4.2 安全访问控制当用户要对一个需安全访问控制的对象操作时,首先根据应用系统自定义的资源ID编码规则及访问对象的相关信息生成ResourceID,和应用系统定义的对此对象进行操作所需的访问权限accessMode,再查找UserPermission_Table表,判别当前用户是否具有相应的操作权限。
5 结论本文结合.Net Framework开发平台提供的新特性,给出了一套基于RBAC通用的普通应用系统权限管理的设计方案,本设计结构简洁、实用,并有较高的灵活性,满足普通应用系统对安全访问控制的需要。
参考文献:
[1] Sandhu R. ,Coyne E. J . ,Feinstein H. L. et al . Role - Based access control models[J ] . IEEE Computer ,1996 ,29 (2) :38 - 47.
[2] 汤鹏翔,一种实用的基于角色访问控制系统设计与实现。计算机应用,2002.22(12):41-43
[3] Julian Fempleman, David Vitter. Visual Studio .Net Framework Black Book[M]. 北京:水利出版社, 2003.