即使已授予权限,仍出现 'permission denied for table foo' 错误

Getting 'permission denied for table foo' error even though permissions have been granted

我已经以数据库所有者(也是超级用户)的身份登录到我的数据库,并创建了一个 role_write 带有 nologin 和 noinherit 标志的角色。

我已经撤销了 public 模式的默认创建权限:

REVOKE CREATE ON SCHEMA public FROM PUBLIC;

并撤销 public 对数据库的访问:

REVOKE ALL ON DATABASE mydb FROM PUBLIC;

我在每个 table 上都有 g运行ted 角色 我希望角色能够拥有 read/write 访问权限。在这个例子中使用 user table,我添加了:

grant insert, select, update, delete on users to role_write;

然后我还为用户提供了 tables、架构、序列和数据库连接的适当权限,并更改了默认权限:

GRANT CONNECT ON DATABASE my to role_write;
grant usage on schema public to role_write;
grant select, insert, update, delete on all tables in schema public to role_write;
grant usage, select on all sequences in schema public to role_write;
alter default privileges in schema public
   grant select, insert, update, delete on tables to role_write;
alter default privileges in schema public
   grant usage, select on sequences to role_write;

我还创建了一个新用户(带有 noinherit 标志)并向该用户添加了 role_write 角色:

grant role_write to newuser;

然后我以 运行:

用户身份登录
set role role_write;

然后为了安全起见,我重启了postgres。

然而即便如此,当我尝试以新用户身份通过​​ sequelize/apollo 服务器连接到数据库并 运行 查询时,我收到错误消息:

permission denied for table users

我不知道我做错了什么。如果我检查用户 table 的权限,它表明 role_write 设置正确。

有什么帮助吗?

编辑: 所以我意识到我需要在每个会话中 运行 set role role_write,而不仅仅是一次。如果我连接到数据库并立即 运行 查询然后我得到错误,但是如果我首先设置角色然后它允许我。

所以我现在的问题是...

如何让 sequelize/apollo 为每个新的数据库连接添加 set role role_write;

亲爱的来自未来的人们:这是我们到目前为止已经弄清楚的...

正如我在编辑中所解释的,问题是我使用 noinherit 标志创建了新用户。当使用 sequelize/apollo 作为从 role_write 角色获取 read/write 权限的唯一方法时,这会导致问题首先是 运行 set role role_write;.

也许有人会给出一个解决方案,让您可以将 set role role_write; 与每个 sequelize/apollo 请求一起发送到服务器,但现在我通过简单地 运行 [=13 解决了这个问题=].现在我不再收到错误消息了。

您只需

ALTER ROLE newuser INHERIT;

那么newuser会继承rolw_write的权限,不需要运行SET ROLE.