Postgres · 源码阅读 · 角色管理

一、背景

 Postgres采用基于角色访问控制机制,角色和用户的区别是用户缺省有LOGIN权限。权限分系统权限和对象权限。本文主要介绍系统权限管理。

二、系统权限属性

系统权限涉及使用数据库的权限,包括:登录LOGIN、超级用户(SUPERUSER)、创建数据库(CREATEDB)、创建角色(CREATEROLE)、口令(PASSWORD)、继承(INHERIT)、连接限制(CONNECTION LIMIT)。

三、角色相关的系统表

1.pg_authid

 表1 pg_authid

2.pg_auth_members

表2 成员关系

四、数据结构

1、CreateRoleStmt

typedef struct CreateRoleStmt

{

NodeTag type;

RoleStmtType stmt_type; //角色类型ROLE/USER/GROUP,枚举类型

char   *role; //角色名

List   *options; //角色属性列表DefElem结构体

} CreateRoleStmt;

2、DefElem

typedef struct DefElem

{

NodeTag type;

char   *defnamespace; //节点对应的命名空间

char   *defname;//节点对应的属性

Node   *arg; //表示值或类型名

DefElemAction defaction; // SET/ADD/DROP 

int location; /* token location, or -1 if unknown */

} DefElem;

五、创建角色流程

1.角色类型判断

2.提取options参数,并赋值给对应DefElem变量

3.DefElem变量类型转换

4.isSuper/replication/byPassrls/createrole权限判断

5.系统保留名判断

6.有效期格式转换

7.密码检查

8.构造new_record数据

9.密码处理,不能为空

10.构造tuple

11.升级的pg_authid_oid赋值

12.insert pg_authid表

13.AddRoleMems处理

六、源码位置

/backend/commands/user.c

七、其他链接

github链接

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容