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