撤销PostgreSQL用户对其他表的访问权限。

问题描述 投票:0回答:1

我有一个PostgreSQL DB用户 "limited_user",我想只给一个表SELECT权限。

GRANT CONNECT ON DATABASE "db1" TO limited_user;
GRANT SELECT ON TABLE users to limited_user; 

但当我尝试\dt时,该用户可以看到这个db1中的所有其他表,而他却可以对 "user "表进行SELECT操作,因为我给了他权限。我怎样才能撤销该用户的访问权限,使他不能看到其他表,而只能看到一个表?

database postgresql postgresql-9.5
1个回答
0
投票

你不能,至少在我所知道的任何直接的方式中不能。

表存在于模式命名空间中,而模式存在于数据库中。要给某一特定表的用户以访问权,意味着你还必须给该用户的 USAGE 表所属模式的权限。USAGE 不授予表本身的权限,只授予相关模式的权限。但是表 定义 是模式的一部分,所以 USAGE 确实允许用户看到表名(还有列名)。

但是,如果在同一模式中还有其他表,用户将无法看到 SELECT 从这些表格中,除非您还 GRANT SELECT 在这些表上,尽管他们将能够看到它们的存在。

这个答案 给了一个相当清晰的解释,权限系统。

编辑补充一下。实现类似结果的一种方法是这样的(使用 psql):

sec_schema=# REVOKE ALL ON ALL TABLES IN SCHEMA sec_schema FROM restricted_user;
REVOKE
sec_schema=# REVOKE USAGE ON SCHEMA sec_schema FROM restricted_user;
REVOKE
sec_schema=# CREATE SCHEMA new_schema;
CREATE SCHEMA
sec_schema=# GRANT USAGE ON new_schema TO restricted_user;
GRANT
sec_schema=# CREATE VIEW new_schema.secret_view AS SELECT * from sec_schema.secret_table;
CREATE VIEW
sec_schema=# GRANT SELECT ON new_schema.secret_view TO restricted_user;
GRANT

这将删除对模式的所有访问 sec_schema 对于用户 restricted_user但随后产生了 new_schemanew_schema.secret_view 这是一个覆盖在 sec_schema.secret_table. 后。GRANT SELECT用户将能够从表中读取数据。sec_schema.secret_table 通过视图,但他们将无法看到任何物体在 sec_schema.

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