PostgreSQL 是一款开源的 DBMS,它使用的是 SQL。它是一个非常强大的工具,用于在 VPS 上管理应用程序和托管 Web 数据。在本教程中,您将学习如何在 PostgreSQL 中管理权限。它将帮助您为应用程序角色提供所需的权限。我们将在 Ubuntu 18.04 上的 云服务器 在 CloudSigma 上。
安装 PostgreSQL
要下载并安装 PostgreSQL,请运行以下命令:
|
1 2 |
sudo apt-get update sudo apt-get install postgresql postgresql-contrib |
安装程序将创建一个默认用户 – “Postgres” 来进行操作。在本教程的大部分内容中,我们将使用该用户。您可以使用以下命令登录该用户:
|
1 |
sudo su - postgres |
现在 PostgreSQL 已经安装完毕,您将学习它如何处理权限。您也可以参考我们的 在 Ubuntu 上设置 PostgreSQL 的教程 以获取安装过程的详细分步指南。
PostgreSQL 权限概念
Postgres 通过 “角色” 的概念来管理权限。在角色中,用户和组之间没有区别。角色比传统的 Unix 用户和组系统更具灵活性。例如,一个角色可以作为另一个角色的成员,从而继承其权限。
在 PostgreSQL 中查看角色
要查看 PostgreSQL 中的角色,您需要先使用以下命令登录到提示符:
|
1 |
psql |
然后,运行以下命令来查看角色:
|
1 |
\du |

到目前为止,只有一个拥有所有特权的默认角色。
如何在 PostgreSQL 中创建角色
您可以从命令行或在 Postgres shell 中为 Postgres 创建角色。您可以尝试以下两种方法,之后您将看到如何在 PostgreSQL 中管理权限和访问。
如何在 PostgreSQL 内部创建角色
创建角色最简单的方法是在 Postgres 的提示符中。您可以使用以下命令来执行此操作:
|
1 |
CREATE ROLE demo_role; |
要检查它是否已创建,请运行以下命令:
|
1 |
\du |

它指定新角色没有登录权限。您将在本教程的后面部分学习如何更改该设置。
如何从命令行创建角色
上述方法的替代方法是从命令行创建用户。要退出 PostgreSQL 提示符,请键入以下内容:
|
1 |
\q |
您可以使用以下命令创建一个名为 “test” 的角色:
|
1 |
createuser test |
执行上述命令后,登录到 psql,并使用以下命令列出角色:
|
1 2 |
psql \du |

您可以观察到,以这种方式创建的用户不具有相同的属性。
如何在 PostgreSQL 中删除角色
您可以使用以下语法轻松删除 PostgreSQL 中的角色:
|
1 |
DROP ROLE role_name; |
您可以使用以下命令删除我们之前创建的演示角色:
|
1 |
DROP ROLE demo_role; |

如果我们尝试删除一个不存在的角色,它只会抛出错误。为了看到这一点,您可以尝试再次删除同一个角色:
|
1 |
DROP ROLE demo_role; |

如果您希望在角色不存在时不让命令抛出错误,可以在命令中添加 ‘IF EXISTS’:
|
1 |
DROP ROLE IF EXISTS role_name; |
您可以尝试使用此命令重新删除该角色:
|
1 |
DROP ROLE IF EXISTS demo_role; |
如何在创建角色时定义特权
到目前为止,您已经创建并删除了角色。在本节中,您将创建具有修改后权限的角色。您可以通过在 create 命令中指定角色的权限来执行此操作:
|
1 |
CREATE ROLE role_name WITH optional_permissions; |
要查看此选项,您可以使用此命令打开帮助:
|
1 |
\h CREATE ROLE |

如果您想创建一个具有登录权限的角色,可以像这样构建命令:
|
1 |
CREATE ROLE demo_role WITH LOGIN; |

正如我们之前所看到的,如果您想创建具有登录权限的角色,您还可以使用以下命令:
|
1 |
CREATE USER role_name; |
这两个命令之间的唯一区别是,‘CREATE USER’ 默认会赋予该角色登录权限。
如何在 PostgreSQL 中更改角色的权限
到迄今为止,您已经尝试了如何在创建用户时赋予权限。在本节中,您将修改已创建用户的权限。alter 命令的语法为:
|
1 |
ALTER ROLE role_name WITH attribute_options; |
例如,如果需要,您可以使用此命令将 demo_role 的登录权限更改为 ‘登录’:
|
1 |
ALTER ROLE demo_role WITH NOLOGIN; |

要允许用户再次登录,您可以使用以下命令修改权限:
|
1 |
ALTER ROLE demo_role WITH LOGIN; |
如何在 PostgreSQL 中以其他用户身份登录
默认情况下,如果您的用户名与系统用户名匹配,PostgreSQL 仅允许您在本地登录。为了解决这个问题,您可以更改登录类型,或者配置 PostgreSQL 使用环回网络接口。该接口会将连接类型更改为远程,即使连接是本地的也是如此。
在本节中,您将尝试第二种方法。首先,您可以设置用户的密码,以便进行身份验证。
使用以下命令设置 ‘demo_user’ 的密码:
|
1 |
\password test |
出现提示时,输入并确认密码。完成后,您可以退出 PostgreSQL 界面并返回到普通的机器用户:
|
1 2 |
\q exit |
PostgreSQL 要求您使用与操作系统用户名匹配的用户名进行登录,并且还要使用相同的用户名连接数据库。由于在这种情况下您没有这样做,因此您必须显式指定要使用的选项。您可以使用以下语法:
|
1 |
psql -U <span class="highlight">user</span> -d <span class="highlight">db</span> -h 127.0.0.1 -W |
user:您要连接的用户名
DB:您有权访问的现有数据库
-h 127.0.0.1:向 PostgreSQL 指定您将通过网络接口连接到本地机器。即使用户名与系统用户名不匹配,此选项也允许我们进行身份验证。
-W:指示 PostgreSQL 您将输入密码
要使用我们的 “test_user” 登录,我们可以发出以下命令:
|
1 |
psql -U test -d postgres -h 127.0.0.1 -W |

输入密码后,您将登录到 shell。在我们的示例中,我们使用数据库 ‘postgres’,这是在安装过程中自动设置的默认数据库。
在此会话中,根据您选择登录的用户,您将面临没有执行各种操作的正确权限的问题。出现该问题的原因是您尚未给予该用户足够的管理权限。
在下一节中,您将向用户授予所需的权限。首先,您需要将用户切换回管理员用户:
|
1 2 3 |
\q sudo su - postgres psql |
在 PostgreSQL 中管理权限:如何在 PostgreSQL 中授予权限
在 PostgreSQL 中,如果数据库或表是由特定角色创建的,则只有该角色有权对其进行修改。具有超级用户权限的角色除外。在本节中,您将向其他角色授予权限。您可以使用 ‘GRANT’ 语句向其他角色授予权限。语法为:
|
1 |
GRANT permission_type ON table_name TO role_name; |
您可以创建一个简单的表来执行该命令:
|
1 2 3 4 |
CREATE TABLE demo ( name varchar(25), id serial, start_date date); |
要查看创建的表,请运行以下命令:
|
1 |
\d |

现在您有了一个 demo 表,您可以将 ‘demo’ 表的权限授予 ‘demo_role’。您可以使用此命令授予该角色 ‘UPDATE’ 权限:
|
1 |
GRANT UPDATE ON demo TO demo_role; |
您可以通过将权限指定为 ‘ALL’ 来向角色授予所有权限:
|
1 |
GRANT ALL ON demo TO demo_role; |
如果您想向系统上的所有角色授予特定权限,可以使用关键字 ‘public’ 代替角色,如下面的命令所示:
|
1 |
GRANT INSERT ON demo TO PUBLIC; |
您可以使用以下命令查看已授予的所有权限:
|
1 |
\z |
在 PostgreSQL 中管理权限:如何在 PostgreSQL 中移除权限
您可以使用 ‘REVOKE’ 命令轻松移除角色的权限。它与 grant 命令非常相似:
|
1 |
REVOKE permission_type ON table_name FROM user_name; |
与 GRANT 类似,我们可以使用关键字 – ‘ALL’ 和 ‘PUBLIC’ 来授予所有权限或向所有角色授予权限:
|
1 |
REVOKE INSERT ON demo FROM PUBLIC; |
如何在 PostgreSQL 中使用组角色
为了实现广泛的权限控制,角色足够灵活,允许与其他角色进行分组。例如,您可以创建一个角色 – ‘temporary_role’,然后将 ‘demo_role’ 和 ‘test_user’ 添加到该角色中:
|
1 2 3 |
CREATE ROLE temporary_role; GRANT temporary_role TO demo_role; GRANT temporary_role TO test_user; |
现在,您只需通过管理 ‘temporary_role’ 角色的权限,即可管理这两个角色的权限。这使得权限管理更加简单。您可以使用此命令查看角色成员身份信息:
|
1 |
\du |

任何组群成员都可以通过使用 ‘set role’ 命令来扮演该组。由于 ‘postgres’ 用户是超级用户,即使您不是该组的成员,也可以使用 ‘set role’:
|
1 |
SET ROLE temporary_role; |
您现在创建的任何表都将归 temporary_role 所有:
|
1 2 3 4 |
CREATE TABLE hello ( name varchar(25), id serial, start_date date); |
要检查表的所属关系,请运行以下命令:
|
1 |
\d |

您可以看到 ‘temporary_role’ 角色拥有新表以及与 serial 数据类型关联的序列。要恢复到原始角色权限,请运行以下命令:
|
1 |
RESET ROLE; |
如果您希望角色拥有其所属角色的所有权限,可以使用 ‘alter role’ 命令指定 ‘inherit’ 属性:
|
1 |
ALTER ROLE test_user INHERIT; |
通过上述命令,‘test_user’ 已获得了它所属角色的所有权限。要删除角色,可以使用 ‘drop role’ 命令:
|
1 |
DROP ROLE temporary_users; |

上述命令会抛出错误,因为我们有一些对象(例如表 ‘hello’)依赖于它。要删除它,您可以将表的所属权转移给其他角色:
|
1 |
ALTER TABLE hello OWNER TO demo_role; |
您可以使用以下命令检查 temporary_role 现在是否不拥有任何表:
|
1 |
\d |

您现在可以删除 ‘temporary_role’ 了,因为它现在没有任何依赖关系:
|
1 |
DROP ROLE temporary_users; |
尽管上述命令会删除 temporary_users 角色,但该角色组的前成员并不会被移除。
结论
您已完成本教程,现在您已了解如何在 PostgreSQL 中管理权限。您可以轻松地管理这些权限。了解如何管理权限可以确保您的应用程序能够访问所需的数据库,同时无法访问其他应用程序使用的任何其他数据库。
祝您计算愉快!


评论
暂无评论。发表第一条评论吧。