位运算实现ACL授权与认证过程的原理解析
在任何权限管理系统中,ACL(Access Control List)都是非常重要且有不可或缺的。权限管理主要包括授权与认证两大部分,下面就看ACL是如何实现授权与认证的。
1、授权,指将权限授予角色或用户
a)如果用户A拥有角色B、角色C,那么,缺省的情况下,用户A将拥有被分配给角色B和角色C的所有权限(即默认情况下,用户A继承其拥有的角色所具有的所有权限);
b)如果用户拥有多个角色,那么用户的权限是这些角色权限的合集;
c)如果用户拥有多个角色,而且角色之间的授权有冲突(比如对同一个资源的同一个操作,一个角色为“允许”,另外一个角色为“不允许”),将以优先级别高的角色(所谓优先级别,也就是对于这个用户所拥有的角色而言,是有顺序的,同一个角色在不同的用户那里可能拥有不同的优先级);
d)除了可以对角色进行授权外,也可以针对用户进行授权,也就是说,将权限授予用户。针对某个资源的所有操作,我们可以设置这些权限对用户来说是“继承”或“不继承”;
i.继承:意思是这些权限将使用其(即用户)所拥有的角色的权限,而不使用其(即用户)单独设置的权限,
ii.不继承:意思是这些权限将使用其单独设置的权限,而不使用其所拥有的角色的权限。
一言以蔽之:授权就是颁发许可证的过程。比如导游证,你有了导游证,你就可以上岗;如果没有,对不起,你玩去。授权就相当于与授予你导游证的过程。
注意需要的说明一点:什么是角色?这里有了用户,为什么还要有角色,用户与角色有什么不同?
角色是抽象的概念。角色可以理解为职位,比如系统管理员,部门经理等这些职位,而用户就是具体的人。一个用户可以身兼多职,一个职务也可以有多个人来负责。所以人员与角色是多对多的关系。
2、认证,指用户访问资源的某些操作时,根据授权,判断是否允许用户的访问
a)在用户访问的时候,需要进行即时的判断(是否有权访问)
b)应该提供查询的功能,可以查询某个用户所拥有的所有权限
一言以蔽之:认证是一个检查过程。给你颁发的导游证,上岗前还需要对你进行检查,如果检查出来你没有导游证,对不起,你不能上岗。
知道了什么是授权与认证,下面看授权与认证如何在代码中体现。下面是一个访问控制类ACL的实现。
符号
描述
运算规则
&
与
两个位都为1时,结果才为1
|
或
两个位都为0时,结果才为0
^
异或
两个位相同为0,相异为1
~
取反
0变1,1变0
<<
左移
各二进位全部左移若干位,高位丢弃,低位补0
>>
右移
各二进位全部右移若干位,对无符号数,高位补0,有符号数,各编译器处理方法不一样,有的补符号位(算术右移),有的补0(逻辑右移)
注意以下几点:
1.在这6种操作符,只有~取反是单目操作符,其它5种都是双目操作符。
2.位操作只能用于整形数据,对float和double类型进行位操作会被编译器报错。
总结
本文主要介绍了授权与认证的概念,位运算基础的简单介绍,如何通过位运算进行授权与认证。大家可以对照最后给出的位运算表格,对授权和认证过程进行比对,看它们具体是如何实现的。
其实一条acl授权记录中除了aclState和aclTriState之外,还主要记录了:角色、资源和授权三条信息。具体内容在后文介绍。