PostgreSQL Role Management(翻译)

原文:https://www.postgresqltutorial.com/postgresql-roles/

PostgreSQL 使用角色(role)概念来管理数据库访问权限。一个角色依赖于创建角色的方式,可以是一个用户(user)或者一个组(group)。具有登录权限的角色被称作用户。一个角色也可以是其他角色(被称作组)的成员。

创建PostgreSQL中的角色

从8.1版本开始,PostgreSQL使用角色的概念来结合用户和组的概念。可使用CREATE ROLE来创建新角色:

CREATE ROLE role_name;

为了获得集群中所有的角色,可使用:

SELECT rolname FROM pg_roles;

如果你是用psql工具,\du命令可以列出所有现有的角色。

角色属性

数据库中角色的属性定义了角色的特权,包括登录,超级用户(superuser),数据库创建,角色创建,用户名,等等。

下面这个语句创建了一个具有登录权限,密码,有效日期的角色:

CREATE ROLE doe WITH PASSWORD 'pgSecpas1970' VALID UNTIL '2020-01-01';

下面这个语句创建了一个具有超级用户状态(也就是说可以绕过授权检查)的角色:

CREATE ROLE bigboss SUPERUSER;

注意,只有超级用户才能创建超级用户。

如果你想要的一个具有创建数据库权限的角色,你可以使用下面的语句:

CREATE ROLE admin CREATEDB;

使用下面的语句创建一个具有创建角色权限的角色:

CREATE ROLE security CREATEROLE;

角色的成员

以组来管理角色使得你可以更简单有效地批量增加或者撤销特权。在PostgreSQL中,你可以创建一个代表组的角色,之后将组的成员地位授予单个用户。

依照惯例,组角色不具有登录权限。

为了创建一个组角色,你可以如下方式使用CREATE ROLE:

CREATE ROLE group_role;

你可以使用GRANT将一个用户添加到组中:

GRANT group_role to user_role;

你可以使用REVOKE将一个用户移除出一个组:

REVOKE group_role FROM user_role;

注意PostgreSQL不允许你包含一个环状的角色关系(也就是不允许a是b的成员同时b是a的成员)。

组合用户角色的继承

一个用户角色可以通过以下的方式使用组角色的特权:

  • 第一种方式,一个用户角色可以使用SET ROLE语句来临时成为一个组角色,也就是用户完全使用组的特权而不是它原来的特权。而且,在这个session中创建的任何数据库对象的所有者是这个组角色,而不是用户角色。
  • 第二种方式,一个具有INHERIT属性的用户角色将会自动具有组角色的特权,包括组角色继承来的特权。

例子:

CREATE ROLE doe LOGIN INHERIT;
CREATE ROLE sales NOINHERIT;
CREATE ROLE marketing NOINHERIT;
GRANT sales to doe;
GRANT marketing to sales;

如果你用doe这个用户连接数据库,你将会具有doe的权限以及sales被授予的权限,因为doe具有INHERIT属性。但是由于sales的NOINHERIT属性,doe不具有marketing的特权。

在执行SET ROLE sales;后,你将只有sales被授予的权限

可以通过RESET ROLE取回原来的权限。

注意只有数据库对象的权限是可继承的。LOGIN, SUPERUSER, CREATEROLE以及CREATEDB是特殊角色,不能被普通权限继承。

移除角色

DROP ROLE role_name;

在移除角色之前,需要重新分配它原来拥有的对象,撤销它的权限。

如果你移除了一个组角色,PostgreSQL将自动撤销成员的权限。

posted @ 2020-05-06 01:05  skynnznk  阅读(187)  评论(0)    收藏  举报