21.2. 角色属性 #
数据库角色可以具有若干属性,它们定义其权限,并与客户端认证系统相互作用。
- 登录权限
只有具有
LOGIN属性的角色才能用作数据库连接的初始角色名。具有LOGIN属性的角色可以被视为“数据库用户”。要创建具有登录权限的角色,可使用以下任一方式:CREATE ROLE
nameLOGIN; CREATE USERname;(
CREATE USER等价于CREATE ROLE,不同之处只在于CREATE USER默认包含LOGIN,而CREATE ROLE不包含。)- 超级用户状态
数据库超级用户会绕过除登录权之外的所有权限检查。这是一种危险的权限,不应草率使用;最好以非超级用户角色完成大部分工作。要创建新的数据库超级用户,使用
CREATE ROLE。这必须由已经是超级用户的角色来执行。nameSUPERUSER- 创建数据库
角色必须被明确授予创建数据库的权限(超级用户除外,因为后者会绕过所有权限检查)。要创建这样的角色,使用
CREATE ROLE。nameCREATEDB- 创建角色
角色必须被明确授予创建更多角色的权限(超级用户除外,因为后者会绕过所有权限检查)。要创建这样的角色,使用
CREATE ROLE。具有nameCREATEROLECREATEROLE权限的角色,可以更改和删除那些以带ADMIN选项的形式授予给该CREATEROLE用户的角色。非超级用户的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。nameREPLICATION LOGIN- 密码
只有在客户端认证方法要求用户连接数据库时提供密码时,密码才有意义。
password和md5认证方法都会使用密码。数据库密码与操作系统密码是分离的。可在创建角色时通过CREATE ROLE指定密码。namePASSWORD 'string'- 权限继承
默认情况下,角色会继承其所属角色的权限。不过,要创建一个默认不继承权限的角色,使用
CREATE ROLE。另外,也可以在单个授权时使用nameNOINHERITWITH INHERIT TRUE或WITH INHERIT FALSE来覆盖继承行为。- 绕过行级安全
角色必须被明确授予绕过每一条行级安全(RLS)策略的权限(超级用户除外,因为后者会绕过所有权限检查)。要创建这样的角色,必须以超级用户身份使用
CREATE ROLE。nameBYPASSRLS- 连接限制
连接限制可以指定一个角色能够建立多少个并发连接。-1(默认值)表示无限制。可在创建角色时通过
CREATE ROLE指定连接限制。nameCONNECTION LIMIT 'integer'
角色的属性可以在创建后通过 ALTER ROLE 修改。有关细节见 CREATE ROLE 和 ALTER ROLE 命令的参考页。
角色还可以为第 19 章中描述的许多运行时配置设置指定角色特定默认值。例如,如果出于某种原因你希望每次连接时都禁用索引扫描(提示:这不是个好主意),你可以使用:
ALTER ROLE myname SET enable_indexscan TO off;
这会保存该设置(但不会立即生效)。在该角色后续建立的连接中,它看起来就像在会话开始之前执行了 SET enable_indexscan TO off 一样。你仍然可以在会话期间更改该设置;它只会作为默认值。要移除角色特定默认设置,使用 ALTER ROLE 。注意,附加到没有 rolename RESET varnameLOGIN 权限的角色上的角色特定默认值几乎没有用,因为它们永远不会生效。
当非超级用户利用 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 用户都可以管理该角色。