【发布时间】:2022-01-03 07:51:01
【问题描述】:
我有多个数据库,每个数据库都有多个架构。
我有一组连接到这些数据库的应用程序。每个应用都有自己的用户,根据其功能,应用可以:
- 读取/写入特定数据库的所有模式和表,设置函数/通知
- 只读特定数据库的所有模式和表
架构和表可以随时创建,因此需要使用 ALTER DEFAULT 设置权限。
我的理解是 ALTER DEFAULT 必须由将创建未来表的用户完成。对吗?
因为我可以有用户 1 可以 RO db A,但 RW db B,而用户 2 只能 RO db B 等的场景。使用角色在这里似乎没有任何帮助。
所以我有点困惑如何设置它。
然后是下一个并发症: 我可以将权限分配为 SELECT (RO) 或 SELECT、INSERT、UPDATE、DELETE (RW),但是:
- 序列呢?我不希望 RW 用户能够更改序列,但他们需要能够使用它们
- 那么它是如何与函数一起工作的呢? RW 用户需要能够设置/更新自己的功能
此设置的任何示例都将不胜感激,因为阅读文档对我没有多大帮助,而且关于 SO 的大多数问题/答案似乎非常相似,但并不完全相同,因此非常令人困惑 :)
编辑,按照 cmets 中“a_horse_with_no_name”的建议,我这样做了:
这是我的 init.sql:
CREATE DATABASE accounts;
CREATE DATABASE analysis;
CREATE DATABASE exchange;
GRANT CONNECT ON DATABASE exchange TO capture, analyzer, sunny, viewer;
GRANT CONNECT ON DATABASE analysis TO analyzer, sunny, viewer;
GRANT CONNECT ON DATABASE accounts TO sunny;
然后我以管理员身份登录到 db exchange 并执行以下操作:
GRANT pg_write_all_data TO capture;
GRANT pg_read_all_data TO analyzer, sunny, viewer;
然后我在那里创建了一个名为 instruments 的表
然后我以捕获的身份登录到数据库交换并进行插入,然后我得到:
42501:桌面工具的权限被拒绝
所以在交换数据库上使用捕获用户,我应该有 pg_write_all_data 属性;为什么我会收到错误消息?
看起来我必须允许使用仪器来捕获..这违背了 pg_write_all_data 的目的。如果我做授权,那么它的工作原理。所以看起来添加角色不起作用。
【问题讨论】:
-
在 Postgres 14 中,有一个预定义的角色:
pg_read_all_datapostgresql.org/docs/current/predefined-roles.html,但这将包括对所有数据库的读取访问权限。但这可以通过不向其他数据库的“全部读取”用户授予 CONNECT 权限来规避。 -
我读到了这个角色,但没想到我可以阻止用户登录其他数据库!我会尝试一下,谢谢!