即使已授予权限,仍出现 '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
.
我已经以数据库所有者(也是超级用户)的身份登录到我的数据库,并创建了一个 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
.