3

我需要授予客户访问我数据库中一组“视图”的权限。我让它工作,以便用户/角色可以选择所需的视图而不是任何表。但是,用户/角色仍然可以浏览架构并查看表和表的列和数据类型等。有没有办法防止这种情况?因此,如果用户/角色使用 PgAdmin III 或 psql 或类似的东西访问数据库,他们只能“看到”授权的视图而没有别的?

4

3 回答 3

1

如果您希望承包商访问视图而无法查看视图从中提取数据的表的结构,那么想到的唯一选择是将视图具体化为实际表 (vie CREATE TABLE AS SELECT ...) 转储这些表,并将它们恢复到您不受信任的承包商可以访问的数据库。

大概您的应用程序将是一个 Web 应用程序或其他一些不会将数据库登录数据放在用户可及范围内的应用程序;否则你有比这更大的问题。

于 2012-08-24T20:39:44.407 回答
1

我认为您不能阻止承包商查看类型。问题是这些都在同一个系统表中,我很害怕如果你撤销对它们的权限会发生什么。从本质上讲,我怀疑什么都行不通。

PostgreSQL 没有限制对类型定义的访问的概念。

但是,您可以通过限制对表的选择访问来阻止他们从表中选择数据。视图在定义它们的用户的本地权限下运行。您可以对基础表进行 REVOKE,并让它们可以访问视图中的数据。但是你不能阻止他们看到底层表的类型定义。

换句话说,更面向对象的方式,您不能安全地允许 PostgreSQL 中的用户查看您的类定义。但是,您可以阻止他们查看实际对象。

编辑:我所知道的唯一以这种方式受到限制的系统目录是那些包含加密密码的系统目录。大多数系统目录都是相对开放的,很多代码都需要获得这些目录的权限。鉴于 PostgreSQL 的对象行为,我认为您不能限制对函数定义(在编译环境中,虽然这不是源代码,但会包括例程所在的共享对象文件)或类型定义(包括表结构)。

Edit2:实际上有一个很好的答案,那就是不要让承包商通过 psql 等直接工具访问数据库,而是要求他们通过您控制的一些中间件。然后,您可以完全访问他们可以看到或看不到的内容。例如,如果需要,您可以修改 phppgadmin 以拒绝在 pg_catalog 模式中显示任何内容。不过,这是 hack-the-tool 领域,您不希望对系统表权限感到困惑。

于 2012-08-25T10:01:39.853 回答
1

如果您想避免在物化视图中复制所有数据..

您可以在不同的集群中设置另一个数据库,因此它不会共享相同的目录。这甚至可以在不同的机器上。

  • 通过dblink访问您的主要数据库中的视图。
  • 仅允许客户无法访问的已定义用户通过 dblink 访问 Prime db 。
  • 创建访问主服务器上数据的表函数。
  • 提供从这些表功能中选择的视图,并允许您的客户用户使用SELECT.

现在他们无法访问基表。

于 2012-08-25T15:02:54.147 回答