角色层次结构

通过将角色授予其他角色,您可以构建角色层次结构,层次结构中较低的角色具有较窄的权限范围,而层次结构中较高的角色被授予角色及其权限的组合。当您按分层方式组织角色时,添加到较低级别角色的任何权限都会自动传播到它们上方的角色。

创建分层角色

以下示例将创建两个角色,为其分配权限,然后将这两个角色分配给另一个角色。

  1. 创建名为 applog 的表:

    => CREATE TABLE applog (id int, sourceID VARCHAR(32), data TIMESTAMP, event VARCHAR(256));
    
  2. 创建 logreader 角色并授予它对表 applog 的只读权限:

    => CREATE ROLE logreader;
    CREATE ROLE
    => GRANT SELECT ON applog TO logreader;
    GRANT PRIVILEGE
    
  3. 创建 logwriter 角色并授予它对表 applog 的写入权限:

    => CREATE ROLE logwriter;
    CREATE ROLE
    => GRANT INSERT, UPDATE ON applog to logwriter;
    GRANT PRIVILEGE
    
  4. 创建 logadmin 角色并授予它对表 applog 的删除权限:

    => CREATE ROLE logadmin;
    CREATE ROLE
    => GRANT DELETE ON applog to logadmin;
    GRANT PRIVILEGE
    
  5. logreaderlogwriter 角色授予角色 logadmin

    => GRANT logreader, logwriter TO logadmin;
    
  6. 创建用户 bob 并向他授予 logadmin 角色:

    => CREATE USER bob;
    CREATE USER
    => GRANT logadmin TO bob;
    GRANT PRIVILEGE
    
  7. 修改用户 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,无法启用 logreaderlogwriter 角色。它们只能通过启用 logadmin 来间接启用。

分层角色授予和 WITH ADMIN OPTION

如果使用 WITH ADMIN OPTION 将一个或多个角色授予另一个角色,则被授予“较高”角色的用户将继承对下级角色的管理访问权限。

例如,您可以按如下方式,将以前授予的角色 logreaderlogwriter 修改为 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)