Postgres - 如何限制创建/删除表的权限?

问题描述

我想在 Postgresql 数据库中创建“只读权限”(包括创建或删除表的限制)。

我的策略是创建一个具有这些权限的组,然后添加已撤销所有权限的角色。这样,只有当属于只读组时才继承权限。

我使用以下命令创建权限,但似乎角色在加入组时可以添加删除表:

role_test_db=# REVOKE ALL ON DATABASE role_test_db FROM select_access_group;
REVOKE
role_test_db=# GRANT CONNECT ON DATABASE role_test_db TO select_access_group;
GRANT
role_test_db=# GRANT SELECT ON ALL TABLES IN SCHEMA public TO select_access_group;
GRANT

我正在阅读 documentation 并且创建表似乎是在 CREATE 权限下,但我没有授予此权限。有人可以解释为什么这个组的用户仍然可以制作表格吗?

解决方法

有几个错误:

  1. 撤销对数据库的权限不会限制用户创建对象的权限。为此,您必须撤销对架构的权限。

  2. 您只能获得REVOKE(默认或明确)GRANT 的权限。我怀疑 select_access_group 是否曾被授予对数据库的任何权限。

您可能忘记撤销对架构 CREATE 的危险默认 public 权限。以超级用户身份连接并运行

REVOKE CREATE ON SCHEMA public FROM PUBLIC;
,

用户只能撤销由该用户直接授予的权限

https://www.postgresql.org/docs/13/sql-revoke.html

查看权限

  1. \du
  2. 从 pg_roles 中选择 *;

更改管理员角色(postgres)下的(基本)权限