openGauss源码解析(199)
openGauss源码解析:安全管理源码解析(10)
9.4 对象权限管理
权限管理是安全管理重要的一环,openGauss权限管理基于访问控制列表(access control list,ACL)实现。
9.4.1 权限管理
1. 访问控制列表
访问控制列表是实现数据库对象权限管理的基础,每个对象都具有ACL,存储该对象的所有授权信息。当用户访问对象时,只有用户在对象的ACL中并且具有所需的权限才能够访问该对象。
每个ACL是由1个或多个AclItem构成的链表,每1个AclItem由授权者、被授权者和权限位3部分构成,记录着可在对象上进行操作的用户及其权限。
数据结构AclItem的代码如下:
typedef struct AclItem {
Oid ai_grantee; /* 被授权者的OID */
Oid ai_grantor; /* 授权者的OID */
AclMode ai_privs; /* 权限位:32位的比特位 */
} AclItem;
其中ai_privs字段是AclMode类型。AclMode是一个32位的比特位。其高16位为权限选项位,当该比特位取值为1时,表示AclItem中的ai_grantee对应的用户具有此对象的相应操作的授权权限,否则表示用户没有授权权限;低16位为操作权限位,当该比特位取值为1时,表示AclItem中的ai_grantee对应的用户具有此对象的相应操作权限,否则表示用户没有相应的权限。在AclMode的结构位图9-18中,Grant Option记录各权限位的权限授予或被转授情况。低16位记录各权限的授予情况,当授权语句使用ALL时,则表示对象的所有权限。
图9-18 openGauss AclMode结构图
openGauss将执行DML类操作和DDL类操作的权限分别记在两个AclMode结构中,并以第15位的值来区分2者,从而实现对于每一个数据库对象,相同的授权者和被授权者对应两个不同的AclMode,分别表示记录DML类操作权限和DDL类操作权限。实现方式如图9-19和图9-20所示。
图9-19 openGauss记录DML类操作权限的AclMode结构
图9-20 openGauss记录DDL类操作权限的AclMode结构
每个权限参数代表的权限如表9-4所示。
表9-4 权限参数
参数 |
对象权限 |
参数 |
对象权限 |
---|---|---|---|
a |
INSERT |
T |
TEMPORARY |
r |
SELECT |
c |
CONNECT |
w |
UPDATE |
p |
COMPUTE |
d |
DELETE |
R |
READ |
D |
TRUNCATE |
W |
WRITE |
x |
REFERENCES |
A |
ALTER |
t |
TRIGGER |
P |
DROP |
X |
EXECUTE |
m |
COMMENT |
U |
USAGE |
i |
INDEX |
C |
CREATE |
v |
VACUUM |