【问题标题】:Getting 'permission denied for table foo' error even though permissions have been granted即使已授予权限,也会出现“表 foo 的权限被拒绝”错误
【发布时间】:2019-09-17 09:44:20
【问题描述】:

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

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

REVOKE CREATE ON SCHEMA public FROM PUBLIC;

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

REVOKE ALL ON DATABASE mydb FROM PUBLIC;

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

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

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

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。

尽管如此,当我尝试以 newuser 身份通过 sequelize/apollo 服务器连接到数据库并运行查询时,我得到了错误:

permission denied for table users

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

有什么帮助吗?

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

所以我现在的问题是……

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

【问题讨论】:

    标签: postgresql database-permissions


    【解决方案1】:

    来自未来的亲爱的人们:这就是我们目前所发现的......

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

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

    【讨论】:

      【解决方案2】:

      你需要做的就是

      ALTER ROLE newuser INHERENT;
      

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

      【讨论】:

        最近更新 更多