PostgreSQL:一个只能访问视图的登录角色

Ada*_*ath 3 postgresql permissions access-control view

我需要编写一个必须执行以下操作的 SQL 文件:

  • 创建一个名为“选择”的角色

  • 授予对当前数据库的连接/使用权限

  • 授予选择/执行所有模式的所有视图(或至少在当前

我尝试了大量的 GRANT...ON...TO 组合,但我无法弄清楚。

附加信息:这些脚本由 ANT 执行,数据库和模式名称 (search_path) 已经设置。所以我不能烧录像“production_db”或“qa_db”这样的名字。

目标是创建单个 PostgreSQL 角色,以便客户端可以绕过 Tomcat (Hibernate) 并直接在 Postgres 服务器上运行选择/搜索。该角色必须能够从视图中进行选择,而不能从其他视图中进行选择。

更新:接受的答案让我找到了一个解决方案,我将所有视图提取到一个单独的架构中,并仅授予对该架构的访问权限。

a_h*_*ame 9

不幸的是,这并不容易,因为没有“选择任何视图”特权(例如 Oracle 提供的)。

如果您可以将所有视图放入单个模式中,则可以通过授予对该模式的选择权限来实现。像这样的东西:

首先你需要创建一个可以用于这个的角色

create role view_reader; 
Run Code Online (Sandbox Code Playgroud)

角色只需要创建一次。

然后创建一个包含所有视图的架构:

create schema view_holder;
Run Code Online (Sandbox Code Playgroud)

然后允许 view_reader 读取该模式中的所有内容:

grant select on all tables in schema report to view_reader;
alter default privileges in schema view_holder grant select on tables to view_reader;
Run Code Online (Sandbox Code Playgroud)

all tables是误导,因为它也包括观点-但表。这就是为什么您需要将视图转换为与表不同的模式的原因。由于alter default privileges在该模式中创建的任何新视图都将自动可供view_reader角色访问。

您现在可以创建一个可以选择任何内容的用户:

create user client password 'foobar';
alter user client set search_path = 'view_holder';
grant view_reader to client;
Run Code Online (Sandbox Code Playgroud)

如果client登录,默认架构将是view_holder,因此 aselect * from some_view将默认为该架构中的视图。但是由于用户仅对该模式中的视图具有权限,因此他无法从基础表中进行选择。

view_reader如果需要,您可以跳过中间角色 ( ) 并将权限直接分配给client。但我认为最好给每个客户一个单独的用户。

如果您无法将视图移动到不同的架构中,那么如果该架构中的视图简单地从“真实”视图中选择,这也应该有效。

请注意,这将增加视图的维护复杂性,因为不幸的是,如果其他视图依赖于它,Postgres 不会让您更改视图的列列表。