管理信息系统的权限设计和C#.NET实现
2009-11-26李晓征
李晓征
摘 要:基于角色的访问控制是一种通常用于指派用户适当角色的模型,它针对企业或组织的策略,授权用户在管理信息系统(MIS)的使用权限。本文描述用户(User)-角色(Role)-权限(Permission)在管理信息系统权限管理的要素,讲解关于基于角色的访问控制(RBAC)模型,并以C#.NET代码为实例,提出实现模型的方法。
关键词:RBAC 角色 权限 C#.NET
中图分类号:G203 文献标识码:B 文章编号:1673-8454(2009)19-0042-02
一、RBAC基本概念和模型
基于角色的访问控制(Role-Based Access Control,简称RBAC)已经成为解决管理信息系统的统一资源访问控制的有效方法,它替代了传统的自主型访问控制和强制访问控制方法。在RBAC中,权限与角色,角色与用户之间通过联结的关系,从而产生用户的权限。这极大地简化了系统的管理权限。RBAC两大特征是:减小授权管理的复杂性,降低管理开销;灵活地支持企业或组织的安全策略,并对系统的变化有很大的伸缩性。
信息系统中的用户、角色、权限及系统资源的基本概念如下:
(1)用户(User):与角色相关,用户要拥有对某种资源的权限,必须通过角色去关联。
(2)角色(Role):可以操作某些资源的权限集合。通过给用户赋予不同的角色,对成员的多职能进行表达,提供约束用户不同权限范围的依据。角色作为用户与权限的代理层,定义权限和用户的关系,所有的授权应该给予角色而不是直接给用户。
(3)权限(Permission):是指与资源相联系的权限。权限是绑定在特定的资源实例上的,比如在内容管理系统(CMS),有“文章的发布权限”,这就表明,该权限是一个发布权限,而且是针对文章这种资源的一种发布权限。权限包括系统定义权限和用户自定义权限。用户自定义权限之间可以指定排斥和包含关系(如:发布、修改、删除、管理四个权限,管理权限包含前三种权限)。
(4)资源(Resource):就是信息系统的资源,比如新闻、文档等各种可以被提供给用户访问的对象。系统资源是一个树形的结构,任何一个节点都是一个资源,一个资源节点可以与若干指定权限类别相关,可定义是否将其权限应用于子节点。
如图1所示,通过一定的约束关系及用户的角色定义、角色的权限赋值,实现用户对数据和资源的访问权限。一个用户是一个人或一个自治的代理(agent),一个角色是一项在组织中的工作功能或工作头衔。而权限是对系统中一个或多个对象(object)的特定访问模式的许可或执行某些动作的特权。如果x≥y,那么角色x就继承了角色y的权限,x的成员也意味着是y的成员。每次会话(session)把一个用户和可能的许多角色联系起来。一个用户可以有一个或多个角色,一个角色可以有许多用户。类似地,一个角色可以有多个权限,同一个权限可以被指派给多个角色。每个会话把一个用户和可能的许多角色联系起来,一个用户在激发他或她所属角色的某些子集时,建立了一个会话,用户可用的权限是当前会话激发的所有角色权限的并集。每个会话和单个用户关联,这个关联在会话的生命期间保持常数。一个用户在同一时间可以打开多个会话,每个会话可以有不同的活动角色。会话的概念相当于传统的访问控制中主体(subject)的标记。
二、RBAC模型的数据库表设计
通过对RBAC模型的分析,可以知道RBAC引入了角色的概念,使得用户和权限分离,从而减少了权限管理的复杂度,可更加灵活地支持安全策略。同时,我们引入资源(Resource)概念,可以对权限进行分门别类,一个资源可以对应多个权限。
在数据库表设计中,我们总共引入了六个表(如图2 所示E-R图)和一个视图,分别是用户表、角色表、权限表、资源表、用户-角色表、角色-权限表及用户-角色-权限视图。
(1)用户表(User):保存用户基本信息,包括用户编号(主键pkid),用户名称,用户密码,用户所在部门等其他信息。
(2)角色表(Role):保存角色编号(主键pkid),角色名称,角色说明等信息。
(3)权限表(Permission):保存权限编号(主键pkid),权限名称,权限说明,权限所在资源等信息。
(4)资源表(Resource):保存资源名称(主键pkid),资源名称等信息。
(5)用户-角色表(User_Role):保存角色编号,角色编号,这两个字段作为表的主键。
(6)角色-权限表(Role_Permission):保存角色编号,权限编号,这两个字段作为表的主键。
(7)用户-角色-权限 (View_U_R_P)视图:创建视图是为了提高表之间的联结查询效率,视图里的一条记录反映了一个用户所对应的一个权限,当用户的角色发生改变时,他所对应的权限也发生改变。
创建视图View_U_R_P的SQL代码:
CREATE VIEW View_R_U_P
AS
SELECTrole.pkid, role.name, user_role.user_pkid, role_ permission.role_pkid, permission.name AS permission_name, role.name AS role_name, permission.resource_pkid, permission.pkid AS permission_pkid, role_permission.permission_range
FROMrole INNER JOIN role_permission ON role.pkid = role_permission.role_pkid INNER JOIN
user_role ON role.pkid=user_role.role_pkid INNER JOIN
permission ON role_permission.permission_pkid = permission.pkid
三、利用C#.NET实现信息管理系统的权限控制
通过对RBAC的模型分析和数据表定义,我们容易得到对用户操作权限进行判断的方法。用户在对信息系统的某个功能模块操作时,首先获取该功能模块所对应的权限编号(permission_pkid)和用户登录系统时创建会话(Session)的user_pkid,利用这两个值判断用户是否有权限操作。下面我们以判断用户是否有权限删除新闻为实例,利用C#.NET实现一个简单的权限控制。在用户点击“删除新闻”按钮时,我们触发服务端控件的事件(Event):
protected void ButtonDelete_Click(object sender, EventArgs e)
{
//判断是否有删除新闻权限
String permission_pkid = "10";//假设删除新闻所对应的permission_pkid为10
String user_pkid = Session[“user_pkid”].ToString;//获取用户登录后的Session中的user_pkid值
bool have_permission = Sql.PubClass.CheckSQL("select * from View_U_R_P where user_pkid=" + user_pkid + " and permission_pkid=" + permission _pkid);
if (have_permission == false)
{
Response.Write(“”);//弹出提示没有权限的对话框
}else
{
//删除新闻操作,代码略去。
}
}
在以上代码中,CheckSQL是数据库操作类SQL.PubClass中的一个成员函数,通过数据访问的封装,很大程度上简化了信息系统编程代码。函数CheckSQL返回的是布尔值(boolean),通过传入sql查询语句,判断是否有
获取到值,如果有则返回值为true,否则为 false。
四、结束语
本文就RBAC的模型进行分析,提出简单实现模型控制的方法。又因权限设计必须考虑多方面的要求,比如角色的继承、权限的互斥等,所以在模型中引入了限制(Constraints),实现一套完整的权限设计方法。
参考文献:
[1]Sandhu R S, Coyne E J, Feinstein H L, et al. Role-based access control models[J].IEEE Computer,1996,29(2):38-47.
[2]Dongwan Shin,Gail-Joon Ahn: Role-based privilege and trust management. Number 6,November 2005.
[3]贾爱华,陈定方.NET平台下基于RBAC模型的用户权限控制[J].湖北工业大学学报,2008(6).
(编辑:金冉)