问题描述
我想在 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 权限下,但我没有授予此权限。有人可以解释为什么这个组的用户仍然可以制作表格吗?
解决方法
有几个错误:
-
撤销对数据库的权限不会限制用户创建对象的权限。为此,您必须撤销对架构的权限。
-
您只能获得
REVOKE
(默认或明确)GRANT
的权限。我怀疑select_access_group
是否曾被授予对数据库的任何权限。
您可能忘记撤销对架构 CREATE
的危险默认 public
权限。以超级用户身份连接并运行
REVOKE CREATE ON SCHEMA public FROM PUBLIC;
,
用户只能撤销由该用户直接授予的权限
https://www.postgresql.org/docs/13/sql-revoke.html
查看权限
- \du
- 从 pg_roles 中选择 *;
更改管理员角色(postgres)下的(基本)权限