0

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

  • 我有一张名为report_files
  • 这张桌子有一个简单的政策,policy <name> for all using (true)
  • 用户grant all对表具有权限(grant all on all tables in schema testing to testuser;,以及grant execute on all functions ...grant usage对于架构)
  • 用户现在可以读取表中的所有字段,但不能insert记录,出乎意料

这是psql的一个非常短的片段,展示了上述内容:https ://gist.github.com/cdaringe/85dd9a7b1278afe4770869dc494216f3

我已经设置了一个许可策略,它清楚地评估 OK,正如成功的select命令所证明的那样。

我可以解决什么问题才能insert使其正常工作?

谢谢!

4

2 回答 2

3

错误:序列 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

于 2018-07-19T05:18:07.343 回答
1

由于我还不能发表评论,如果今天有人像我一样来到这个线程,我会添加一些输入作为答案。

是的,除了已经在表上授予的权限之外,您还必须单独授予对序列的权限。事实上,这是你必须做的。

即使您的表依赖于序列对象,但从 RDBMS 的角度来看,它们都是不同的对象,因此它们需要不同的权限。

至于您的索引示例,在表的子对象中进行索引,并且不需要额外的权限就可以使用索引,因此除了创建索引之外不需要进一步的操作。

此外,请注意为序列名称添加前缀,以防它存储在不是默认模式 ( public) 且不在您的search_path. 如果不是这种情况,即使您对要使用的序列拥有所有必要的特权,您也可能会遇到权限被拒绝错误。

于 2020-04-14T15:25:29.153 回答