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. 设置示例数据库和表
-
使用 postgres 数据库登录 PostgreSQL。
-
创建一个名为 的新数据库
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. 设置角色和组角色
- 创建一个
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;
- 将
contacts表上的所有权限授予marketing:
grant all on contacts to marketing;
- 将
forecasts表上的所有权限授予planning:
grant all on forecasts to planning;
- 添加
jane为以下成员marketing:
grant marketing to jane;
- 添加
planning为以下成员marketing:
grant marketing to planning;
步骤 3. 使用角色
- 如果您使用角色连接到 PostgreSQL
jane,您将拥有直接授予的jane权限以及授予的任何权限,marketing因为jane继承了市场营销的权限:
psql -U jane -d corp
- 它会提示你输入 jane 的密码。
3)角色 jane 可以从 forecasts 表中选择数据:
dcorp=> select * from forecasts;
4)并在 contacts 表中插入一行:
corp=> insert into contacts(name, phone) values('Jone Doe','408-102-3459');
- 但是,
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;
-
该角色
jane将拥有授予 的特权planning,而不是直接jane或间接授予 的特权marketing。 -
现在,
jane可以在forecasts表中插入一行:
corp=> insert into forecasts(year, month, amount) values(2020,1,1000);
- 如果
jane尝试从contacts表中选择数据,会失败,因为角色planning没有对该contacts表的权限:
corp=> select * from contacts;
ERROR: permission denied for table contacts
要恢复 的原始权限 jane ,请使用以下 RESET ROLE 语句:
RESET ROLE;
概括
- 管理对组角色而不是单个角色的权限。
- 具有
INHERIT属性的角色获取其所属组角色的所有权限。