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

7vux5j2d  于 2024-01-07  发布在  PostgreSQL
关注(0)|答案(2)|浏览(199)

由于隐私问题,我想给予一组用户仅对应用程序的特定列进行选择性访问。因此,当用户在受限表上键入“SELECT选项”时,他只能看到允许的列。

我想做的事:

1.对特定用户组隐藏表的特定列
1.“SELECT *”照常工作,但隐藏列,这是不允许的
1.不应禁止对基础表执行JavaScript,即使它会暂时破坏视图(稍后修复它也没关系)
比如说:

  • 组名为“restricted_group”
  • 表为“users”(id,description,password)

目标是:当来自“restricted_group”的用户执行SELECT * FROM用户时,他必须只看到“id”,“description”字段。
我试了两种方法:
1.将视图用于基础表:

CREATE VIEW restricted_view AS
SELECT "id", "description" FROM users;
GRANT SELECT ON restricted_view to restricted_group;

字符串
它完成了这项工作,但它防止了表“users”上的任何错误,因为Postgres的限制“不能改变表,因为其他对象依赖于它”。对我来说,Postgres中的行为非常奇怪,因为在Oracle中,它只能使视图无效,但不能防止错误。使用CASCADE或重新创建VIEW作为此任务的一部分是不可行的。
1.使用列的显式GRANT访问:

GRANT SELECT ("ID", "desc") ON users TO restricted_group;


它禁止用户进行“SELECT * users”,并要求显式列出所有允许的列,这对用户来说并不友好。因为用户应该首先检查任何列以进行访问,而不是快速获取数据。
请告诉我一个解决方案,这将满足所有的初步要求?

kfgdxczn

kfgdxczn1#

Postgres并不完全限制对视图的表的修改,只是那些会破坏视图的表。只要你不改变其他东西所依赖的表列,你就可以通过任何方式添加/更改/删除表列。不仅仅是视图,还有外键引用,任何pg_dependpg_constraint条目。
如果你想要一个可断开的视图,或者只是将它与底层表解耦,使用一个普通的SQL表或集返回函数,或者在视图和源表之间放置一个:

create table test(id int,description text,priv text);
insert into test select 1,'description','priv';

select * from test;

字符串
| ID|描述|priv|
| --|--|--|
| 1 |描述|priv|
正如您所观察到的,一个常规的、直接的视图将通过依赖关系与表绑定,从而阻止一些更改:

create view v_test as select id,description from test; 
alter table test drop column description,
                 alter column id type bigint,
                 add column description uuid default gen_random_uuid();
ERROR:  cannot drop column description of table test because other objects depend on it
DETAIL:  view v_test depends on column description of table test
HINT:  Use DROP ... CASCADE to drop the dependent objects too.

的数据
一个中间函数消除了这种依赖性:

create function f_test() returns table(id int, description text) 
security definer language sql as '
  select id,description from test';
drop view if exists v_test;
create view v_test as select * from f_test();
select * from v_test;


| ID|描述|
| --|--|
| 1 |描述|

alter table test drop column description,
                 alter column id type bigint,
                 add column description uuid default gen_random_uuid();

select * from v_test;


| ID|描述|
| --|--|
| 1 |94c7bb56-8ab1-4b2a-85a6-3ebb302acd50|
只要在表中找到的类型可以被强制为函数应该返回的类型,这将继续工作。
fiddle

o75abkj4

o75abkj42#

没有。
你坚持了以下要求:
1.如果使用视图,它必须始终可用且有效。
1.您打算对基础表进行更改,这将使视图无效。
1.当基础表发生更改时,您不准备重新创建视图。
1.您希望查询能够为所有列指定“*”,但实际上并不返回所有列。
这组要求根本不相容。
显而易见的解决方案是在需要时重新创建视图,但您没有说明为什么这不是您的选择。

相关问题