Redrock Postgres 搜索 英文
版本: 9.3 / 9.4 / 9.5 / 9.6 / 10 / 11 / 12 / 13 / 14 / 15 / 16 / 17

21.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权限的角色可以更改和删除已使用ADMIN选项授予CREATEROLE用户的角色。当不是超级用户的CREATEROLE用户创建一个新角色时会自动发生这样的授予操作,因此,默认情况下CREATEROLE用户可以更改和删除他们已经创建的角色。更改角色包括使用ALTER ROLE可以执行的大部分更改,例如更改密码。它还包括对角色的修改,该修改可以使用COMMENTSECURITY LABEL命令进行。

然而,CREATEROLE 无法传达创建 SUPERUSER 角色的能力,它也不会对现有的 SUPERUSER 角色有任何控制权。此外,CREATEROLE 不会传达创建 REPLICATION 用户或授予或撤销 REPLICATION 权限的能力,也不能修改此类用户的角色属性。但是,它确实允许在 REPLICATION 角色上使用 ALTER ROLE ... SETALTER ROLE ... RENAME,以及使用 COMMENT ON ROLESECURITY LABEL ON ROLEDROP ROLE。最后,CREATEROLE 不会赋予授予或撤销 BYPASSRLS 权限的能力。

发起复制

角色必须被明确赋予发起流复制的权限(超级用户除外,因为它们绕过所有权限检查)。用于流复制的角色也必须具有 LOGIN 权限。要创建这样的角色,请使用 CREATE ROLE name REPLICATION LOGIN

密码

只有当客户端身份验证方法要求用户在连接到数据库时提供密码时,密码才很重要。passwordmd5 身份验证方法使用密码。数据库密码与操作系统密码分离。在角色创建时使用 CREATE ROLE name PASSWORD 'string' 指定密码。

权限继承

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

绕过行级安全

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

连接限制

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

创建角色后,可以借助 ALTER ROLE 修改其属性。 参阅有关命令 CREATE ROLEALTER ROLE 的参考页面以获取详细信息。

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

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 用户授予此类其他授权。任何 CREATEROLE 用户在某个时间点获得某个角色的 ADMIN OPTION 都可以管理该角色。