http://www.cnblogs.com/zc22/archive/2007/10/08/917493.html
RBAC 权限入门
RBAC概念
RBAC:Role Based Access Control,核心是用户只和角色关联,而某角色可以拥有各种各样的权限并可继承。
RBAC白话介绍
RBAC有很多模型,最简单的就是Core RBAC。说白了就是User用户, Role角色, Permission许可 三个对象。
l 角色有多个操作许可
l 当用户分配了一个角色,就有了这个操作。
那么在程序里面怎么实现呢?很简单。
首先我们有一系列操作,例如Open File, Close File, Save File等。在代码里面可以一些方法。
然后我们有多个角色,例如Manager, Worker。
他们之间的对应关系如下,一般写在配置文件或者保存在数据库。
当进行权限验证的时候,就是看这个用户的角色是否包含这个动作的permission.
{
Dictionary < string , string > userToRole = new Dictionary < string , string > ();
Dictionary < string , List < string >> roleToPermission = new Dictionary < string , List < string >> ();
public RBCA()
{
// 初始化manager的权限
string manager = " Manager " ;
List < string > managerlist = new List < string > ();
managerlist.Add( " OpenFile " );
managerlist.Add( " CloseFile " );
managerlist.Add( " SaveFile " );
// 初始化worker的权限
string worker = " Worker " ;
List < string > workerlist = new List < string > ();
workerlist.Add( " OpenFile " );
roleToPermission.Add(manager, managerlist);
roleToPermission.Add(worker, workerlist);
// 初始化用户pixysoft的角色
string user = " pixysoft " ;
userToRole.Add(user, manager);
}
public void OpenFile( string user)
{
string role = userToRole[user];
// 检测权限
if ( ! roleToPermission[role].Contains( " OpenFile " ))
return ;
Console.Write( " Open file succeed! " );
}
public void CloseFile( string user)
{
string role = userToRole[user];
// 检测权限
if ( ! roleToPermission[role].Contains( " CloseFile " ))
return ;
Console.Write( " CloseFile succeed! " );
}
public void SaveFile( string user)
{
string role = userToRole[user];
// 检测权限
if ( ! roleToPermission[role].Contains( " SaveFile " ))
return ;
Console.Write( " SaveFile succeed! " );
}
}
一个超级简单的RBAC就体现出来的,但是没有任何实用价值。下面我会使用AOP思想去实现这个权限系统。
RBAC优缺点分析
优点在于:
l 易用和高效的授权方式 :用户在进行授权时只需对角色进行授权,之后将相应的角色分配给用户即可。
l 简便和高效的授权模型维护 :在技术角度来讲,进行授权模型的维护上因为基本只需要维护关联模型而显得简单而高效。
缺点在于:
l 复杂的权限校验 :在进行权限校验时需要不断的遍历和递规,造成了性能的影响。
l 对于数据权限的不够支持 :没有明确的数据权限模型,可以看到在经过重构的数据权限模型其实已经和 RBAC 模型有一定的出入,而且在数据权限的校验上实现起来是非常的低效。
参考资料
http://www.blogjava.net/BlueDavy/archive/2005/05/18/4745.html
http://www.blogjava.net/renyangok/archive/2006/12/06/85838.html