PostgreSQL用户/角色仅限于视图?

时间:2012-08-24 18:06:01

标签: postgresql postgresql-9.1

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

3 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:1)

我认为你不能阻止承包商查看类型。问题是这些是在相同的系统表中,我非常害怕如果撤消对这些表的权限会发生什么。从本质上讲,我怀疑没有任何东西可行。

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

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

另外,更加面向对象的方式,你不能安全地允许PostgreSQL中的用户查看你的类定义。但是,您可以阻止它们查看实际对象。

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

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

答案 2 :(得分:1)

如果您想避免重复实体化视图中的所有数据..

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

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

现在他们无法访问基表。