22.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权限的角色可以更改和删除已授予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。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命令的参考页。
角色还可以针对第 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用户都可以管理它。
