在PostgreSQL中限制用户只能访问一个模式?

3

在PostgreSQL中,是否可能创建一个只能访问单个模式的用户?

以下是我尝试过的方法:

REVOKE ALL ON DATABASE testdb FROM public;
GRANT CONNECT ON DATABASE testdb TO testuser;

当我作为testuser连接时,实际上我无法访问实际数据:

> SELECT * FROM some_table;
ERROR:  permission denied for relation some_table

然而,我仍然可以列出所有其他模式中的表等:

SELECT * FROM pg_tables;
     schemaname     |                 tablename                 | tableowner | tablespace | hasindexes | hasrules | hastriggers | rowsecurity
--------------------+-------------------------------------------+------------+------------+------------+----------+-------------+-------------
 test2              | foo                                       | postgres   |            | t          | f        | f           | f
 test2              | bar                                       | postgres   |            | t          | f        | f           | f
...

然后,您需要撤销对除他自己的所有模式的访问权限(如该问题的答案中所述)。 - Burhan Khalid
我以为我已经做了那个,我该如何检查? - AndreKR
@Abelisto 我想让不同的用户共享一个数据库,这样有足够权限的用户就可以在模式之间连接数据,但普通用户不能。 - AndreKR
抱歉我表达不够清楚。您所描述的问题是用户能够列出任何模式中的表,即使它没有权利从这些表中选择数据。对吗?换句话说:我可以看到盒子,但我看不到盒子里的内容。这是一个问题吗? - Abelisto
当然,如果“用户”实际上是不同的用户(=人员;或者被攻破的应用程序),那就是一个巨大的问题。对于任何不是开源的应用程序来说,表格和(尤其是)列名称都是非常敏感的信息。 - AndreKR
显示剩余4条评论
2个回答

5

无法配置PostgreSQL,使用户只能看到他或她拥有权限的系统目录中的对象。

如果您需要这样的设置,应为每个用户创建一个数据库。


1
这并不是批评,但是什么是“每个用户一个数据库”,它如何帮助? - Abelisto
也许我表达得太简洁了。从评论中可以清楚地看出,@AndreKR希望多个用户使用一个数据库,每个用户都有自己的模式,而且没有人应该能够看到其他人拥有的对象。这是不可能实现的。因此,最好为每个用户使用一个数据库。 - Laurenz Albe

0
我可以这样做:
GRANT USAGE ON SCHEMA schema_name TO user_name;
ALTER USER user_name SET search_path = schema_name;

ALTER USER语句是一种永久设置模式搜索路径的方式,就像您使用

SET search_path命令为单个会话设置模式搜索路径一样。

SET SEARCH_PATH= schema_name_1, schema_name_2;

3
你尝试过以user_name身份运行SELECT * FROM pg_tables,然后检查他是否无法看到任何其他模式吗? - AndreKR

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接