PostgreSQL 角色成员资格

在本教程中,您将了解 PostgreSQL 组角色以及如何使用它们更有效地管理权限。

摘要:在本教程中,您将了解 PostgreSQL 组角色以及如何使用它们更有效地管理权限。

PostgreSQL 组角色介绍

将角色作为一个组进行管理更容易,这样您就可以从整个组中授予或撤销权限,而不是对单个角色执行此操作。

通常,您创建一个代表组的角色,然后将组角色的成员资格授予各个角色。

按照惯例,组角色没有 LOGIN 特权。这意味着您将无法使用组角色登录 PostgreSQL。

要创建组角色,请使用以下 CREATE ROLE 语句:

CREATE ROLE group_role_name;

例如,以下语句创建一个组角色 sales :

CREATE ROLE sales;

当你 \du 在 psql 工具中使用命令时,你会看到组角色和用户角色一起列出:

List of roles
 Role name |                         Attributes                         | Member of
-----------+------------------------------------------------------------+-----------
 alice     |                                                            | {}
 api       | 1000 connections                                           | {}
 bob       | Cannot login                                               | {}
 dba       | Create DB                                                  | {}
 john      | Superuser                                                  | {}
 postgres  | Superuser, Create role, Create DB, Replication, Bypass RLS | {}
 sales     | Cannot login                                               | {}

要将角色添加到组角色,请使用以下 GRANT 语句形式:

GRANT group_role to user_role;

例如,以下语句将角色添加 alice 到组角色 sales :

GRANT sales TO alice;

如果 \du 再次运行该命令,您将看到 alice now 是 的成员 sales :

\du
List of roles
 Role name |                         Attributes                         | Member of
-----------+------------------------------------------------------------+-----------
 alice     |                                                            | {sales}
 api       | 1000 connections                                           | {}
 bob       | Cannot login                                               | {}
 dba       | Create DB                                                  | {}
 john      | Superuser                                                  | {}
 postgres  | Superuser, Create role, Create DB, Replication, Bypass RLS | {}
 sales     | Cannot login                                               | {}

要从组角色中删除用户角色,请使用 REVOKE 语句:

REVOKE group_role FROM user_role;

例如,以下语句使用该 REVOKE 语句 alice 从组角色中删除角色 sales :

REVOKE sales FROM alice;

请注意,PostgreSQL 不允许您具有循环成员资格循环,其中一个角色是另一个角色的成员,反之亦然。

PostgreSQL 角色成员身份示例

角色可以通过以下方式使用组角色的权限:

  • 首先,具有该 INHERIT 属性的角色将自动拥有其所属组角色的权限,包括该角色继承的任何权限。
  • 其次,角色可以使用 SET ROLE 语句临时成为组角色。该角色将拥有组角色的权限,而不是其原始登录角色。此外,由角色创建的对象归组角色所有,而不是由登录角色拥有。

步骤 1. 设置示例数据库和表

  1. 使用 postgres 数据库登录 PostgreSQL。

  2. 创建一个名为 的新数据库 corp :

create database corp;

3)切换到 corp 数据库:

\c corp

4)创建 contacts 表:

create table contacts(
   id int generated always as identity primary key,
   name varchar(255) not null,
   phone varchar(255) not null
);

5)创建 forecasts 表:

create table forecasts(
    year int, 
    month int, 
    amount numeric
);

步骤 2. 设置角色和组角色

  1. 创建一个 jane 可以使用密码登录的角色,并继承其所属组角色的所有权限:
create role jane inherit login password 'securePass1';

2)授予 select 的 forecasts 表 jane :

grant select on forecasts to jane;

3)使用 \z 命令查看grant表:

\z

4)创建 marketing 组角色:

create role marketing noinherit;

5)创建 planning 组角色:

create role planning noinherit;
  1. 将 contacts 表上的所有权限授予 marketing :
grant all on contacts to marketing;
  1. 将 forecasts 表上的所有权限授予 planning :
grant all on forecasts to planning;
  1. 添加 jane 为以下成员 marketing :
grant marketing to jane;
  1. 添加 planning 为以下成员 marketing :
grant marketing to planning;

步骤 3. 使用角色

  1. 如果您使用角色连接到 PostgreSQL jane ,您将拥有直接授予的 jane 权限以及授予的任何权限, marketing 因为 jane 继承了市场营销的权限:
psql -U jane -d corp
  1. 它会提示你输入 jane 的密码。

3)角色 jane 可以从 forecasts 表中选择数据:

dcorp=> select * from forecasts;

4)并在 contacts 表中插入一行:

corp=> insert into contacts(name, phone) values('Jone Doe','408-102-3459');
  1. 但是, jane 不能在 forecasts 表中插入一行:
corp=> insert into forecasts(year, month, amount) values(2020,1,1000);
ERROR:  permission denied for table forecasts

6)执行以下 SET ROLE 语句后:

corp=> set role planning;
  1. 该角色 jane 将拥有授予 的特权 planning ,而不是直接 jane 或间接授予 的特权 marketing 。

  2. 现在, jane 可以在 forecasts 表中插入一行:

corp=> insert into forecasts(year, month, amount) values(2020,1,1000);
  1. 如果 jane 尝试从 contacts 表中选择数据,会失败,因为角色 planning 没有对该 contacts 表的权限:
corp=> select * from contacts;
ERROR:  permission denied for table contacts

要恢复 的原始权限 jane ,请使用以下 RESET ROLE 语句:

RESET ROLE;

概括

  • 管理对组角色而不是单个角色的权限。
  • 具有 INHERIT 属性的角色获取其所属组角色的所有权限。