当用户具有“全部授予”权限和松散策略时,如何使用 RLS 将记录插入 Postgres
How can I insert records into Postgres with RLS when user has `grant all` perms and a loose policy
我是 Postgres 的 RLS 功能的新手。我相信我正在适当地遵循文档,但出现了意外行为。考虑以下情况:
- 我有一个名为
report_files
的 table
- 这个table有一个简单的政策,
policy <name> for all using (true)
- 用户对 table 具有
grant all
权限(grant all on all tables in schema testing to testuser;
,以及对架构的 grant execute on all functions ...
和 grant usage
)
- 用户现在可以读取 table、 中的所有字段,但不能读取
insert
记录,这与预期相反
这是来自 psql 的 非常短的片段,展示了上述内容:https://gist.github.com/cdaringe/85dd9a7b1278afe4770869dc494216f3
我已经设置了一个宽松的政策,它清楚地评估了 OK,正如成功的 select
命令所证明的那样。
如何解决问题才能让 insert
正常工作?
谢谢!
ERROR: permission denied for sequence report_files_id_seq
在我看来,您需要授予用户使用 id 序列的权限:report_files_id_seq
您应该可以通过以下方式做到这一点
GRANT USAGE, SELECT ON SEQUENCE report_files_id_seq TO testuser;
或批量添加所有表:
GRANT USAGE, SELECT ON ALL SEQUENCES IN SCHEMA <insert schema name here>
ALL
等同于 USAGE, SELECT, UPDATE
由于我还不能发表评论,如果今天有人像我一样来到这个话题,我会添加一些意见作为答案。
是的,除了已经授予 table(s) 的权限之外,您还必须单独授予对序列的权限。事实上这是你必须要做的。
即使您的 table 依赖于序列对象,从 RDBMS 的角度来看,它们都是不同的对象,因此它们需要不同的权限。
至于您的索引示例,索引在 table 的子对象中,并且不需要额外的权限就可以使用索引,因此除了创建索引之外不需要其他操作。
此外,请注意序列名称的前缀,以防它存储在不是默认模式 (public
) 且不在您的 search_path
中的模式中。
如果不是这种情况,即使您对要使用的序列拥有所有必要的权限,您也可能会遇到权限被拒绝的错误。
我是 Postgres 的 RLS 功能的新手。我相信我正在适当地遵循文档,但出现了意外行为。考虑以下情况:
- 我有一个名为
report_files
的 table
- 这个table有一个简单的政策,
policy <name> for all using (true)
- 用户对 table 具有
grant all
权限(grant all on all tables in schema testing to testuser;
,以及对架构的grant execute on all functions ...
和grant usage
) - 用户现在可以读取 table、 中的所有字段,但不能读取
insert
记录,这与预期相反
这是来自 psql 的 非常短的片段,展示了上述内容:https://gist.github.com/cdaringe/85dd9a7b1278afe4770869dc494216f3
我已经设置了一个宽松的政策,它清楚地评估了 OK,正如成功的 select
命令所证明的那样。
如何解决问题才能让 insert
正常工作?
谢谢!
ERROR: permission denied for sequence report_files_id_seq
在我看来,您需要授予用户使用 id 序列的权限:report_files_id_seq
您应该可以通过以下方式做到这一点
GRANT USAGE, SELECT ON SEQUENCE report_files_id_seq TO testuser;
或批量添加所有表:
GRANT USAGE, SELECT ON ALL SEQUENCES IN SCHEMA <insert schema name here>
ALL
等同于 USAGE, SELECT, UPDATE
由于我还不能发表评论,如果今天有人像我一样来到这个话题,我会添加一些意见作为答案。
是的,除了已经授予 table(s) 的权限之外,您还必须单独授予对序列的权限。事实上这是你必须要做的。
即使您的 table 依赖于序列对象,从 RDBMS 的角度来看,它们都是不同的对象,因此它们需要不同的权限。
至于您的索引示例,索引在 table 的子对象中,并且不需要额外的权限就可以使用索引,因此除了创建索引之外不需要其他操作。
此外,请注意序列名称的前缀,以防它存储在不是默认模式 (public
) 且不在您的 search_path
中的模式中。
如果不是这种情况,即使您对要使用的序列拥有所有必要的权限,您也可能会遇到权限被拒绝的错误。