Postgres 在 SELECT * 中对用户隐藏一些列

问题描述 投票:0回答:1
出于隐私方面的考虑,我想让一组用户仅选择性地访问应用程序的特定列。因此,当用户在受限表上键入 '''SELECT *''' 时,他只能看到允许的列。

我想要实现的目标:

    对特定用户组隐藏表的特定列
  1. “SELECT *”照常工作,但隐藏列,这是不允许的
  2. 底层的DDL不应该被禁止,即使它可能暂时破坏视图(稍后修复它也可以)
比方说:

    群组名称为“restricted_group”
  • 该表是“用户”(id、描述、密码) 目标是: 当来自“restricted_group”的用户执行 SELECT * FROM users 时,他必须只能看到“id”、“description”字段。
我尝试了两种方法:

    使用基础表的视图:
CREATE VIEW restricted_view AS SELECT "id", "description" FROM users; GRANT SELECT ON restricted_view to restricted_group;
它完成了这项工作,但由于 Postgres 的限制“不能更改表,因为其他对象依赖于它”,它阻止了表“用户”上的任何 DDL。
Postgres 中的行为对我来说非常奇怪,因为在 Oracle 中它只会使视图无效,但不会阻止 DDL。
使用 CASCADE 或重新创建 VIEW 作为此任务的一部分是不可行的。

    使用对列的显式 GRANT 访问权限:
GRANT SELECT ("ID", "desc") ON users TO restricted_group;
它禁止用户进行“SELECT * users”,并要求显式列出所有允许的列,这对用户不友好。因为用户应该首先检查任何列的访问情况,而不是快速获取数据。

请告诉我一个可以满足所有初始要求的解决方案?

database postgresql view database-design ddl
1个回答
0
投票
没有。

您坚持以下要求:

    如果使用视图,它必须始终可用且有效。
  1. 您打算对基础表进行更改,这将使视图无效。
  2. 当基础表发生更改时,您不准备重新创建视图。
  3. 您希望查询能够为所有列指定“*”,但实际上并不返回所有列。
这组要求根本不兼容。

显而易见的解决方案是在需要时重新创建视图,但您没有说明为什么这不适合您。

© www.soinside.com 2019 - 2024. All rights reserved.