PostgreSQL用户角色权限

本文详细介绍了PostgreSQL中的角色概念,强调了其与用户的关系。在macOS上安装时,PostgreSQL会根据macOS用户名创建角色。通过`CREATEROLE`命令,可以创建新角色,并使用`ALTERROLE`添加或修改角色属性,如`LOGIN`、`SUPERUSER`等。创建用户等效于创建带有`LOGIN`属性的角色。密码可以通过`PASSWORD`关键字添加,而权限可以通过`GRANT`和`REVOKE`操作进行管理。此外,还介绍了如何创建组角色以及如何利用`INHERIT`属性传递权限。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在PostgreSQL中,所有内容都是围绕role概念构建的。

在macOS上首次安装PostgreSQL时,该脚本使用您的macOS用户名创建了一个角色 ,并授予了权限列表。

PostgreSQL中没有用户,只有role 。

通过在终端中运行psql postgres ,您将使用您的macOS用户名自动登录到PostgreSQL,从而访问创建的角色。

就我而言,创建了flaviocopes角色,可以使用\du命令看到它:

看到? 默认情况下,我具有以下角色属性 :

  • Superuser

  • Create role

  • Create DB

  • Replication

  • Bypass RLS

而且我不是任何其他角色的成员(稍后再讨论)

创建一个新角色 (Creating a new role)

使用CREATE ROLE命令创建一个新角色:

CREATE ROLE <role>;

例如:

CREATE ROLE testing;

我们有了一个Cannot login角色属性的新角色。 我们新创建的用户将无法登录。

您可以先输入\q命令,然后再输入psql postgres -U testing尝试,但是您会看到此错误:

要解决此问题,我们必须在创建时添加LOGIN角色属性:

CREATE ROLE <role> WITH LOGIN;

如果我们使用以下方法删除该角色:

DROP ROLE <role>;

并这次添加WITH LOGIN :

DROP ROLE testing;
CREATE ROLE testing WITH LOGIN;

我们可以看到testing角色可以登录,因为这次我们没有Cannot login role属性:

尝试添加命令\q退出,然后添加psql postgres -U testing :

请注意, 提示已从=#更改为=>因为我们现在没有Superuser角色属性。

为角色添加密码 (Adding a password to a role)

在上一个CREATE ROLE命令中,我们创建了一个没有密码的角色。 当然,拥有(安全)密码非常重要。 您可以使用PASSWORD关键字添加密码:

CREATE ROLE <role> WITH LOGIN PASSWORD '<password>';

创建用户 (CREATE USER)

使用自动添加的LOGIN属性来定义角色的另一种方法(有效地创建可以登录的用户)是使用CREATE USER :

CREATE USER <role> PASSWORD '<password>';

向角色添加角色属性 (Adding a role attribute to a role)

稍后可以使用ALTER ROLE命令将角色属性添加到角色。

假设我们创建了一个没有LOGIN属性的角色:

CREATE ROLE <username> PASSWORD '<password>';

我们可以使用以下方法添加它:

ALTER ROLE <role> WITH LOGIN;

内置角色属性 (Built-in role attributes)

我们已经看到LOGIN角色属性,以允许角色登录。

但是,我们还可以使用其他哪些内置角色属性?

  • LOGIN / NOLOGIN:允许(或不允许)登录到PostgreSQL

  • SUPERUSER / NOSUPERUSER:允许(或不允许)超级用户权限。 数据库超级用户将绕过除LOGIN (必须单独授予)以外的其他权限检查。

  • CREATEDB / NOCREATEDB:允许(或不允许)创建新数据库的能力

  • CREATEROLE / NOCREATEROLE:允许(或不允许)创建新角色

  • CREATEUSER / NOCREATEUSER:允许(或不允许)创建新用户

  • INHERIT / NOINHERIT:允许(或不允许)使特权可继承

  • REPLICATION / NOREPLICATION:授予(或不授予)复制权限(我们将不介绍的高级主题)

组角色 (Group roles)

在PostgreSQL中,没有用户组。

相反,您可以创建具有特定权限的角色,然后将这些角色授予其他角色。

如果角色具有INHERIT属性,则角色将继承授予他们的角色的权限。

建立群组角色 (Create a group role)

要创建组角色,请键入

CREATE ROLE <groupname>;

语法与创建角色相同。

创建组角色后,您可以使用GRANT将角色添加到组角色中:

GRANT <groupname> TO <role>

例如,我们可以创建一个flavio用户角色,一个“雇员”组角色,并将该用户分配给该组角色:

CREATE USER flavio PASSWORD 'superSecret123$';
CREATE ROLE employee;
GRANT employee TO flavio;

您可以使用以下方法从组角色中删除角色:

REVOKE <groupname> FROM <username>

例:

REVOKE employee FROM flavio;

组角色属性 (Group role attributes)

默认情况下,将角色添加到组角色不会使该角色继承组角色的属性(权限)。

您需要使用INHERIT属性创建组角色。

假设您创建了雇员组角色,并为其分配了CREATEDB属性:

CREATE ROLE employee WITH CREATEDB INHERIT;

现在使用INHERIT创建一个新角色:

CREATE ROLE flavio;
GRANT employee TO flavio;

翻译自: https://flaviocopes.com/postgres-user-permissions/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值