基于角色的用户权限管理(Role Based Access Control)

         在很多系统中,Windows认证和Form认证就能够满足用户的需求了,但在比较复杂的大、中型系统中,它们就显得苍白无力,如某个功能页面的某个按钮也是一个功能点,只有授权的用户才能操作。在这种情况下,微软提供的二种授权方式就难以实现了。那么,有其它方法吗?答案是肯定的,这就是基于角色的用户权限管理,简称RBAC

         基于角色的权限管理有3个主体,它们是用户,角色和功能。我们可以通过下面的例子看待它们3者的关系:

张三(用户)是某学校的辅助员(角色),所以他能够呈报某个学生的处分(功能);同时他又是教师(角色),他也有登记学生成绩的权限(功能);

从这个例子中,我们能够看到基于角色权限管理的功能有一个叠加的特性,即一个用户同时拥有多个角色时,他应该拥有所有角色都拥有的功能。当然,一个角色也可以被多个用户同时拥有,一个角色可以操作多个功能,一个功能也能被多个角色操作。间接地,一个用户可以操作多个功能,当然,一个功能也可被多个用户操作。于是,他们的关系是M:N:K,即多:多:多,如下图:

在应用系统中,我们如何能快速地得知某个用户拥有哪些功能的操作权限呢?Ado.Net Entity FrameWork对视图拥有非常强大的映射处理能力,它能方便、快速地将数据库对象(表、视图、存储过程等)映射为实体类,在用户登录时将用户的权限读取出来,用.Net静态变量的特性将用户角色功能关系常驻内存(其实,它就是一个用户访问功能列表,因为这些关系的使用频率非常高,所以在用户登录后常驻内存是非常有必要的),便于判断其用户权限,从而得知用户是否拥有对当前功能的操作权限。

当然,这里的功能还可以跟随与当前功能页面相关的页面和按钮级功能,例如:用户维护是一个功能,这个功能却包含了添加用户、修改用户、注销用户和激活用户等子功能。如果我们仅仅将用户维护功能授权给角色是远远不够的,我们不但需要将添加用户和修改用户这2个页面功能也授权给角色,并且还需要考虑是否将注销用户和激活用户这2个按钮功能点也授权给角色。

ASP.Net Web应用程序中,我们通常会重写OnInit方法用以判断用户是否拥有操作当前页面的权限,代码如下:

        protected override void OnInit(EventArgs e)

        {

            If (!IsAuthenticated())

{

         //没有授权处理

}

            base.OnInit(e);

        }

那么,我们又是如何处理按钮级的权限控制的呢?与页面功能同理,如果用户没有相关权限,只需重写基类的PreRedner方法或Render方法,隐藏相关的功能控件即可。

posted @ 2010-12-11 17:34  Michael-zds  Views(932)  Comments(0)    收藏  举报