postgresql 当用户拥有`grant all`权限和宽松的策略时,如何使用RLS将记录插入Postgres

8fsztsew  于 2023-03-29  发布在  PostgreSQL
关注(0)|答案(2)|浏览(129)

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

wvmv3b1j

wvmv3b1j1#

错误:序列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 version〉=10,并且只使用序列来生成主键值,我的首选是完全避免使用序列。你可以使用IDENTITY列来做到这一点。例如:

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

参见the docs

nzk0hqpo

nzk0hqpo2#

由于我还不能发表评论,我会添加一些输入作为答案,如果有人像我一样今天到达这个线程。
是的,除了已经在表上授予的权限之外,您还必须单独授予序列的权限。事实上,这就是您必须做的。
即使您的表依赖于序列对象,从RDBMS的Angular 来看,它们都是不同的对象,因此它们需要不同的权限。
至于你的索引示例,在表的子对象中建立索引,并且不需要额外的特权就可以使用索引,因此除了创建索引之外,不需要进一步的操作。
此外,如果序列名存储在一个不是默认模式(public)的模式中,并且不在您的search_path中,请注意给序列名加上前缀。如果不是这种情况,即使您对要使用的序列拥有所有必要的权限,也可能会遇到权限拒绝错误。

相关问题