Skip to content

22.2. 角色属性# ​

数据库角色可以具有多个属性,这些属性定义了其权限并与客户端身份验证系统进行交互。

登录权限

只有具有 LOGIN 属性的角色才能用作数据库连接的初始角色名称。具有 LOGIN 属性的角色可以被认为与 “数据库用户” 相同。要创建具有登录权限的角色,请使用

CREATE ROLE name LOGIN;
CREATE USER name;

(CREATE USER 等效于 CREATE ROLE,但 CREATE USER 默认包含 LOGIN,而 CREATE ROLE 则不包含。

超级用户状态

数据库超级用户绕过所有权限检查,但登录权限除外。这是一个危险的权限,不应粗心大意地使用;最好以非超级用户的角色完成大部分工作。要创建新的数据库超级用户,请使用 CREATE ROLE name SUPERUSER。您必须以已经是超级用户的角色执行此操作。

数据库创建

必须明确授予角色创建数据库的权限(超级用户除外,因为他们绕过所有权限检查)。要创建这样的角色,请使用 CREATE ROLE name CREATEDB。

角色创建

必须明确授予角色创建更多角色的权限(超级用户除外,因为他们绕过所有权限检查)。要创建这样的角色,请使用 CREATE ROLE name CREATEROLE。具有 CREATEROLE 权限的角色可以更改和删除已授予 CREATEROLE 用户(具有 ADMIN 选项)的角色。当非超级用户的 CREATEROLE 用户创建新角色时,会自动发生这样的授予,因此默认情况下,CREATEROLE 用户可以更改和删除他们创建的角色。更改角色包括可以使用 ALTER ROLE 做出的大多数更改,例如更改密码。它还包括可以使用 COMMENT 和 SECURITY LABEL 命令对角色进行的修改。

但是,CREATEROLE 不会传递创建 SUPERUSER 角色的能力,也不会传递对已存在的 SUPERUSER 角色的任何权限。此外,CREATEROLE 不会传递创建 REPLICATION 用户的权限,也不会传递授予或撤销 REPLICATION 权限的能力,也不会传递修改此类用户的角色属性的能力。但是,它确实允许在 REPLICATION 角色上使用 ALTER ROLE ... SET 和 ALTER ROLE ... RENAME,以及使用 COMMENT ON ROLE、SECURITY LABEL ON ROLE 和 DROP ROLE。最后,CREATEROLE 不会赋予授予或撤销 BYPASSRLS 权限的能力。

启动复制

必须明确授予角色启动流复制的权限(超级用户除外,因为他们绕过了所有权限检查)。用于流复制的角色还必须具有 LOGIN 权限。要创建这样的角色,请使用 CREATE ROLE name REPLICATION LOGIN。

密码

只有当客户端身份验证方法要求用户在连接到数据库时提供密码时,密码才具有意义。password 和 md5 身份验证方法使用密码。数据库密码与操作系统密码是分开的。使用 CREATE ROLE name PASSWORD 'string' 在创建角色时指定密码。

权限继承

默认情况下,角色会继承其所属角色的权限。但是,要创建默认情况下不继承权限的角色,请使用 CREATE ROLE name NOINHERIT。或者,可以通过使用 WITH INHERIT TRUE 或 WITH INHERIT FALSE 来覆盖单个授予的继承。

绕过行级安全性

必须明确授予角色绕过所有行级安全性 (RLS) 策略的权限(超级用户除外,因为他们绕过所有权限检查)。要创建此类角色,请使用 CREATE ROLE name BYPASSRLS 作为超级用户。

连接限制

连接限制可以指定角色可以进行多少个并发连接。-1(默认值)表示没有限制。使用 CREATE ROLE name CONNECTION LIMIT 'integer' 在创建角色时指定连接限制。

角色的属性可以在创建后使用ALTER ROLE修改。有关详细信息,请参阅CREATE ROLE和ALTER ROLE命令的参考页。

角色还可以针对第 20 章中描述的许多运行时配置设置具有特定于角色的默认值。例如,如果您出于某种原因希望在每次连接时禁用索引扫描(提示:这不是一个好主意),则可以使用

ALTER ROLE myname SET enable_indexscan TO off;

这将保存设置(但不会立即设置)。在此角色的后续连接中,它将显示为会话开始前已执行SET enable_indexscan TO off。您仍然可以在会话期间更改此设置;它将仅为默认值。要删除特定于角色的默认设置,请使用ALTER ROLE*rolename*RESET*varname*。请注意,附加到没有LOGIN权限的角色的特定于角色的默认值相当无用,因为它们永远不会被调用。

当非超级用户使用CREATEROLE权限创建角色时,创建的角色会自动授予创建用户,就像引导超级用户执行命令GRANT created_user TO creating_user WITH ADMIN TRUE, SET FALSE, INHERIT FALSE一样。由于CREATEROLE用户只有在对现有角色拥有ADMIN OPTION时才能对该角色行使特殊权限,因此此授权仅足以允许CREATEROLE用户管理他们创建的角色。但是,由于它是使用INHERIT FALSE, SET FALSE创建的,因此CREATEROLE用户不会继承创建角色的权限,也不能使用SET ROLE访问该角色的权限。但是,由于任何对角色拥有ADMIN OPTION的用户都可以将该角色的成员资格授予任何其他用户,因此CREATEROLE用户可以通过使用INHERIT和/或SET选项将该角色重新授予自己,从而获得对创建角色的访问权限。因此,默认情况下不继承权限,也不默认授予SET ROLE的事实是防止意外事故的保障措施,而不是安全功能。另请注意,由于此自动授权是由引导用户授予的,因此CREATEROLE用户无法删除或更改它;但是,任何超级用户都可以撤销它、修改它和/或向其他CREATEROLE用户发出此类其他授权。在任何给定时间对角色拥有ADMIN OPTION的任何CREATEROLE用户都可以管理它。