即使已授予权限,仍出现“表 foo 的权限被拒绝”错误

Jak*_*ake 6 postgresql database-permissions

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

我已通过以下方式撤销了公共架构的默认创建权限:

REVOKE CREATE ON SCHEMA public FROM PUBLIC;
Run Code Online (Sandbox Code Playgroud)

并通过以下方式撤销对数据库的公共访问:

REVOKE ALL ON DATABASE mydb FROM PUBLIC;
Run Code Online (Sandbox Code Playgroud)

我已在每个表上授予角色,我希望该角色能够具有读/写访问权限。使用user本示例的表格,我添加了:

grant insert, select, update, delete on users to role_write;
Run Code Online (Sandbox Code Playgroud)

然后,我还为用户授予了对表、模式、序列和数据库连接的适当权限,并通过以下方式更改了默认权限:

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;

Run Code Online (Sandbox Code Playgroud)

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

grant role_write to newuser;
Run Code Online (Sandbox Code Playgroud)

然后我以该用户身份登录:

set role role_write;
Run Code Online (Sandbox Code Playgroud)

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

但即使如此,当我尝试通过sequelize/apollo 服务器作为 newuser 连接到数据库并运行查询时,我收到错误:

permission denied for table users
Run Code Online (Sandbox Code Playgroud)

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

有什么帮助吗?

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

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

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

Jak*_*ake 2

亲爱的来自未来的人们:这是我们到目前为止所得出的结论......

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

也许有人会回答一个解决方案,让您将set role role_write;每个sequelize/apollo 请求发送到服务器,但现在我通过简单地运行alter role newuser with inherit;. 现在我不再收到错误消息了。