PostgreSQL的用户权限实例介绍

169 阅读4分钟

在PostgreSQL中,所有的东西都是围绕着角色的概念建立的。

当第一次在macOS上安装PostgreSQL时,脚本用你的macOS用户名创建了一个角色,并给出了一系列的权限。

在PostgreSQL中没有用户,只有角色

通过在终端运行psql postgres ,你会自动用你的macOS用户名登录到PostgreSQL,因此可以访问创建的角色。

在我的例子中,flaviocopes 角色被创建,我可以通过使用\du 命令看到它。

看到了吗?我有以下默认的角色属性

  • Superuser
  • Create role
  • Create DB
  • Replication
  • Bypass RLS

并且我不是任何其他角色的成员(后面会有更多的介绍)

创建一个新的角色

使用CREATE ROLE 命令可以创建一个新的角色。

比如说。

我们得到了一个新的角色,其角色属性为Cannot login 。我们新创建的用户将无法登录。

你可以试着输入\q 命令,然后再输入psql postgres -U testing ,但你会看到这个错误。

为了解决这个问题,我们必须在创建时添加LOGIN 角色属性。

CREATE ROLE <role> WITH LOGIN;

如果我们使用删除该角色。

并在这次添加WITH LOGIN

DROP ROLE testing;
CREATE ROLE testing WITH LOGIN;

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

通过添加命令\q 来尝试退出,然后再添加psql postgres -U testing

注意到提示=# 变成了=> ,因为我们现在没有了Superuser 角色属性。

为一个角色添加密码

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

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

CREATE USER

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

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

为一个角色添加一个角色属性

一个角色属性可以在以后使用ALTER ROLE 命令添加到一个角色中。

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

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

我们可以使用添加它。

ALTER ROLE <role> WITH LOGIN;

内置的角色属性

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

但是我们还可以使用哪些内置的角色属性呢?

  • LOGIN / : 允许(或不允许)登录到PostgreSQLNOLOGIN
  • SUPERUSER / : 允许(或不允许)超级用户的权限。一个数据库超级用户将绕过其他权限检查,除了 (必须单独授予)。NOSUPERUSER LOGIN
  • CREATEDB / : 允许(或不允许)创建新数据库的能力。NOCREATEDB
  • CREATEROLE / : 允许(或不允许)创建新角色的能力NOCREATEROLE
  • CREATEUSER / :允许(或不允许)创建新用户的能力NOCREATEUSER
  • INHERIT / :允许(或不允许)使权限可以继承的能力NOINHERIT
  • REPLICATION / : 授予(或不授予)复制权限(一个高级话题,我们不涉及)。NOREPLICATION

组角色

在PostgreSQL中,不存在用户组。

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

如果这些角色有 INHERIT 属性,角色将继承授予它们的角色的权限。

创建一个群组角色

要创建一个群组角色,键入

语法与创建一个角色相同。

一旦群组角色被创建,你可以使用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;

组角色属性

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

你需要创建带有INHERIT 属性的组角色。

假设你创建了雇员组角色,并给它分配了CREATEDB 属性。

CREATE ROLE employee WITH CREATEDB INHERIT;

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

CREATE ROLE flavio;
GRANT employee TO flavio;