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

时间:2019-04-28 15:53:19

标签: postgresql database-permissions

我已经以数据库所有者(也是超级用户)身份登录数据库,并创建了一个带有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。

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

permission denied for table users

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

有帮助吗?

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

所以我的问题是...

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

2 个答案:

答案 0 :(得分:0)

亲爱的未来人们:这是到目前为止我们所想的...

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

也许有人会回答一个解决方案,使您可以将每个续集/阿波罗请求发送给set role role_write;到服务器,但是现在我只运行了alter role newuser with inherit;就解决了这个问题。现在,我不再收到错误消息。

答案 1 :(得分:0)

您需要做的就是

ALTER ROLE role_write INHERENT;

然后,该角色的每个成员将自动继承其特权,并且无​​需运行SET ROLE