部分内容翻译自wiki(en) by 锅巴GG(Gosber@Fleaphp)
1. 什么是RBAC(Role-Based Access Control)
在计算机系统安全领域,RBAC是一种限制授权用户进行系统访问的实现。它相对于以前的MAC(mandatory access control)以及Discretionary access control(DAC)较新也较流行,同时丰富了访问控制的实现方式。
在一个组织内部,角色(Roles)被指定为对其工作职能的抽象。具体的角色被授权获得一些许可(Permissions)。一种许可明确履行一个确定的操作。系统的用户(Users)被指定为明确的角色,通过获得用户拥有的角色列表,获取到各个角色拥有的授权的集合,从而明确一个用户所拥有的许可权限的总和。在明确被赋予不同角色的用户拥有了获得许可的权限列表之后,实现对不同用户在系统中不同功能(Function)执行的访问控制(Access Control)。
请留意RBAC区别于Context-Based Access Control (CBAC)的特点。
因为RBAC分离了用户与具体授权许可,所以在RBAC的设计中,用户所拥有的权限必须通过具体的角色集合来获得,所以使得我们可以抽象出不同的权限许可的描述,来轻松为每一个具体的用户指定不同的角色集合,从而赋予不同的用户最详细级别的授权的集合。
经过上述的描述,我们用一个简单的方向
System Function->Permission->Role->User
从这个方向,我们看出,我们设计的角度可以非常的清晰灵活。例如:
我假设bbs系统中有两种功能,编辑帖子和阅读帖子。
那么我们可以描述为:
System Function:
R. 阅读帖子
W. 编辑帖子
相应的权限用布尔值来表示:
SF Permission
R R+ 能 (true)
R R- 不能(false)
W W+ 能 (true)
W W- 不能(false)
然后我们分离出四种角色:
Roles:
R1 只能阅读帖子
R1′ 不能阅读帖子
R2 只能编辑帖子 ‘现实中很少用,但是其实是有实际意义的
R2′ 不能编辑帖子
那么这些角色的授权许可,可以表示为:
Role Permission
R1 R+
R1′ R-
R2 W+
R2′ W-
权限的个数的排列组合可以得出实际能抽象出的角色的个数,然而实际访问控制的应用中,我们可能按系统的需要仅仅需要其中的几个组合方式:
例如:
Permission: BBS应用中的角色
R- 非注册用户R1’ (不能读帖子)
R+ 注册用户R1 (只能读帖子不能修改)
R+,W+ 管理员R1+R2 (用户同时具有两种角色,既能够读取,也能够修改)
*一般RBAC中要求角色明确具有的许可为有授权,其他情况都视为无授权。
可以看出,RBAC给予我们最大的灵活性来控制不同的功能的许可授权控制。所以即便我们一开始不考虑最终我们会独立出多少种角色,只要我们在
每个功能点的访问中实现检测访问的用户是否具有相应的权限,就可以达到访问控制的目的,例如(伪代码):
function ReadThread($ArticleID){
if (!CheckPermission($CurrentUser,$PermissionTokenArray)){
Return;//无授权直接退出函数
}
}
function CheckPermission($CurrentUser,$PermissionTokenArray){
//1.获得用户的所有的角色列表
//2.获得用户拥有的角色所具有的授权许可列表
//3.对比需要验证的$PermissionTokenArray中包含的授权,如果许可列表中未包含$PermissionTokenArray中的某一项内容,则返回false,否则返回true.
}
转载请注明:xilo blog » 什么是RBAC (FLEA\Com\RBAC 文档)