角色层次结构
通过将角色授予其他角色,您可以构建角色层次结构,层次结构中较低的角色具有较窄的权限范围,而层次结构中较高的角色被授予角色及其权限的组合。当您按分层方式组织角色时,添加到较低级别角色的任何权限都会自动传播到它们上方的角色。
创建分层角色
以下示例将创建两个角色,为其分配权限,然后将这两个角色分配给另一个角色。
-
创建名为
applog
的表:=> CREATE TABLE applog (id int, sourceID VARCHAR(32), data TIMESTAMP, event VARCHAR(256));
-
创建
logreader
角色并授予它对表applog
的只读权限:=> CREATE ROLE logreader; CREATE ROLE => GRANT SELECT ON applog TO logreader; GRANT PRIVILEGE
-
创建
logwriter
角色并授予它对表applog
的写入权限:=> CREATE ROLE logwriter; CREATE ROLE => GRANT INSERT, UPDATE ON applog to logwriter; GRANT PRIVILEGE
-
创建
logadmin
角色并授予它对表applog
的删除权限:=> CREATE ROLE logadmin; CREATE ROLE => GRANT DELETE ON applog to logadmin; GRANT PRIVILEGE
-
将
logreader
和logwriter
角色授予角色logadmin
:=> GRANT logreader, logwriter TO logadmin;
-
创建用户
bob
并向他授予logadmin
角色:=> CREATE USER bob; CREATE USER => GRANT logadmin TO bob; GRANT PRIVILEGE
-
修改用户
bob
的帐户,使他的logadmin
角色在登录时自动启用:=> ALTER USER bob DEFAULT ROLE logadmin; ALTER USER => \c - bob You are now connected as user "bob". => SHOW ENABLED_ROLES; name | setting ---------------+---------- enabled roles | logadmin (1 row)
启用分层角色
只能为用户启用已向其显式授予的角色。在前面的示例中,对于 bob
,无法启用 logreader
或 logwriter
角色。它们只能通过启用 logadmin
来间接启用。
分层角色授予和 WITH ADMIN OPTION
如果使用 WITH ADMIN OPTION
将一个或多个角色授予另一个角色,则被授予“较高”角色的用户将继承对下级角色的管理访问权限。
例如,您可以按如下方式,将以前授予的角色 logreader
和 logwriter
修改为 logadmin
:
=> GRANT logreader, logwriter TO logadmin WITH ADMIN OPTION;
NOTICE 4617: Role "logreader" was already granted to role "logadmin"
NOTICE 4617: Role "logwriter" was already granted to role "logadmin"
GRANT ROLE
现在,用户 bob
有权通过他的 logadmin
角色将其两个下级角色授予其他用户,在本例中是将角色 logreader
授予用户 Alice
:
=> \c - bob;
You are now connected as user "bob".
=> GRANT logreader TO Alice;
GRANT ROLE
=> \c - alice;
You are now connected as user "alice".
=> show available_roles;
name | setting
-----------------+-----------
available roles | logreader
(1 row)
注意
因为在将 logadmin
角色授予 bob
时未包括 WITH ADMIN OPTION
,所以他不能将该角色授予 alice
:
=> \c - bob;
You are now connected as user "bob".
=> GRANT logadmin TO alice;
ROLLBACK 4925: The role "logadmin" cannot be granted to "alice"