当用户拥有"授予所有"权限和宽松的策略时,我如何使用RLS将记录插入Postgres



我是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正常工作?

谢谢!

错误:拒绝序列report_files_id_seq 的权限

您需要授予使用report_files_id_seq序列的权限。授予表的权限并不授予序列的权限。它们是完全分开的。序列经常被表用作DEFAULT值的部分,但它不是表的部分。

您可以通过以下方式授予序列权限:

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

**这不会为运行命令后创建的序列授予权限。


您需要使用序列吗

如果您使用的是Postgres版本>10,并且只使用序列来生成主键值,我的偏好是完全避免序列。您可以使用IDENTITY列来完成此操作。例如:

CREATE TABLE t (
id INT GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY,
description TEXT NOT NULL
);

参见文档

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

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

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

例如,对于索引,在表的子对象中进行索引,并且不需要额外的特权就可以使用索引,因此除了创建索引之外,不需要其他操作。

此外,如果序列名存储在一个不是默认模式(public(且不在您的search_path中的模式中,请小心为其添加前缀。如果不是这样,即使您对要使用的序列拥有所有必要的权限,您也可能会遇到拒绝权限的错误。

最新更新