当用户具有“全部授予”权限和松散策略时,如何使用 RLS 将记录插入 Postgres

How can I insert records into Postgres with RLS when user has `grant all` perms and a loose policy

我是 Postgres 的 RLS 功能的新手。我相信我正在适当地遵循文档,但出现了意外行为。考虑以下情况:

这是来自 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 中的模式中。 如果不是这种情况,即使您对要使用的序列拥有所有必要的权限,您也可能会遇到权限被拒绝的错误。