暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

openGauss权限检查

openGauss小助手 2021-10-23
1165

用户在对数据库对象进行访问操作时,数据库会检查用户是否拥有该对象的操作权限。通常数据库对象的所有者和初始用户(superuser)拥有该对象的全部操作权限,其他普通用户需要被授予权限才可以执行相应操作。数据库通过查询数据库对象的访问控制列表检查用户对数据库对象的访问权限,数据库对象的ACL保存在对应的系统表中,当被授予或回收对象权限时,系统表中保存的ACL权限位会被更新。常用的数据库对象权限检查函数、ACL检查函数、ACL所在系统表以及对象所有者检查函数对应关系如表9-5所示。

表9-5 数据库对象函数对应关系表。

对象权限检查ACL检查所有者检查系统表
tablepg_class_aclcheckpg_class_aclmaskpg_class_ownercheckpg_class
columnpg_attribute_aclcheckpg_attribute_aclmaskNApg_attribute
databasepg_database_aclcheckpg_database_aclmaskpg_database_ownercheckpg_database
functionpg_proc_aclcheckpg_proc_aclmaskpg_proc_ownercheckpg_proc
languagepg_language_aclcheckpg_language_aclmaskpg_language_ownercheckpg_language
largeobjectpg_largeobject_aclcheck_snapshotpg_largeobject_aclmask_snapshotpg_largeobject_ownercheckpg_largeobject_metadata
namespacepg_namespace_aclcheckpg_namespace_aclmaskpg_namespace_ownercheckpg_namespace
tablespacepg_tablespace_aclcheckpg_tablespace_aclmaskpg_tablespace_ownercheckpg_tablespace
foreign data wrapperpg_foreign_data_wrapper_aclcheckpg_foreign_data_wrapper_aclmaskpg_foreign_data_wrapper_ownercheckpg_foreign_data_wrapper
foreign serverpg_foreign_server_aclcheckpg_foreign_server_aclmaskpg_foreign_server_ownercheckpg_foreign_server
typepg_type_aclcheckpg_type_aclmaskpg_type_ownercheckpg_type

下面以表的权限检查为例进行权限检查过程说明。表权限检查函数pg_class_aclcheck的定义代码如下:

AclResult pg_class_aclcheck(Oid table_oid, Oid roleid, AclMode mode, bool check_nodegroup)

{

if (pg_class_aclmask(table_oid, roleid, mode, ACLMASK_ANY, check_nodegroup) != 0)

return ACLCHECK_OK;

else

return ACLCHECK_NO_PRIV;

}

pg_class_aclcheck函数有4个入参,其中table_oid用于表示待检查的表,roleid用于表示待检查的用户或角色,mode表示待检查的权限,此权限可以是一种权限也可以是多种权限的组合。第4个参数check_nodegroup用于表示是否检查nodegroup逻辑集群权限,如果调用时不给此参数赋值则默认为true。函数返回值为枚举类型AclResult,如果检查结果有权限返回ACLCHECK_OK,无权限则返回ACLCHECK_NO_PRIV。

pg_class_aclcheck函数通过调用pg_class_aclmask函数实现对象权限检查。pg_class_aclmask函数有5个参数,其中第4个参数how为AclMaskHow枚举类型,包括ACLMASK_ALL和ACLMASK_ANY两种取值;ACLMASK_ALL表示需要满足待检查权限mode中的所有权限,ACLMASK_ANY表示只需满足待检查权限mode中的一种权限即可。pg_class_aclmask函数的其余4个参数table_oid、roleid、mode和check_nodegroup,直接由pg_class_aclcheck函数传入。pg_class_aclmask函数从pg_class系统表中获取ACL权限信息并调用aclmask函数完成权限位校验,通过AclMode数据类型返回权限检查结果。

「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论