PostgreSQL 教程: 使用角色和权限进行授权

十二月 12, 2023

摘要:在本教程中,您将学习如何使用 PostgreSQL 中的角色和权限进行授权。

在数据库中,用户被授予的权限超过所需的权限是很常见的。有时,默认的 postgres 用户会被用作应用程序用户和备份用户。这可能很危险,因为超级用户具有最高级别的权限。具有超级用户角色的用户可以删除一个数据库及其数据。同时,可能很难去将每个数据库对象的权限授予每个用户。为此,我们可以使用角色和权限的概念。在本教程中,我们将讨论如何使用角色和权限,在 PostgreSQL 中执行更好的授权机制。

准备工作

在尝试使用角色和权限隔离权限之前,必须区分要在数据库中实现的访问控制。例如,如果数据库为连接到不同模式或表的两个应用程序模块提供服务,那最好有两个或多个角色,对服务于应用程序模块的每个模式或每组对象,这些角色可用于授予读取或写入的访问权限。这样,对服务于特定应用程序模块的对象,如果只需要授予用户读取访问权限(而不是全部),我们可以授予 read_only 访问权限。

操作步骤

我们可以使用以下步骤来进行权限分配:

1. 创建默认为 NOLOGIN 权限的 read_only 和 read_write 角色:

$ psql -d rockdb "CREATE ROLE scott_read_only"
$ psql -d rockdb "CREATE ROLE scott_read_write"

2. 向 read_only 角色授予所有表的读取访问权限,向 read_write 角色授予所有表的写入访问权限:

$ psql -d rockdb "GRANT USAGE, SELECT ON ALL TABLES IN SCHEMA scott TO scott_read_only"
$ psql -d rockdb "GRANT USAGE, SELECT, INSERT, UPDATE, DELETE ON ALL TABLES IN SCHEMA scott TO scott_read_write"

3. 现在,将 read_only 角色授予开发人员,将 read_write 角色授予应用程序用户:

$ psql -d "GRANT scott_read_only TO dev_user"
$ psql -d "GRANT scott_read_write TO app_user"

怎么做到的…

在本教程讨论的步骤中,我们假设应用程序访问的对象都在 scott 模式中。为了正确隔离读取和写入访问权限,我们看到了在步骤 1 中创建两个角色时使用的命令。创建角色后,可以适当地向角色授予读取和写入访问权限,如步骤 2 所示。授予权限后,可以将 read_only 角色分配给只需要读取访问权限的用户(开发人员),并将 read_write 角色分配给应同时具有读取和写入访问权限的用户,如步骤 3 所示。