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

cda*_*nge 1 sql postgresql row-level-security

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

谢谢!

Ano*_*ous 5

错误:序列report_files_id_seq 的权限被拒绝

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

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

GRANT USAGE, SELECT ON SEQUENCE report_files_id_seq TO testuser;
Run Code Online (Sandbox Code Playgroud)

或者向特定模式中的所有序列**授予权限:

GRANT USAGE, SELECT ON ALL SEQUENCES IN SCHEMA <insert schema name here>
Run Code Online (Sandbox Code Playgroud)

ALL相当于USAGE, SELECT, UPDATE

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


您需要使用序列吗?

如果您使用的 Postgres 版本 >=10,并且仅使用序列来生成主键值,我的偏好是完全避免序列。您可以通过使用IDENTITY列来做到这一点。例如:

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

请参阅文档