我有一个名为just_one_schema_user
的用户。
在我的数据库中,我有两个模式:public
和sample
如何使这个用户只能看到sample
?
这是我所做的:
GRANT USAGE ON SCHEMA sample TO just_one_schema_user
REVOKE ALL PRIVILEGES ON SCHEMA public FROM just_one_schema_user
但是用户仍然可以列出public
中的表并查看它们的结构。
我有一个名为just_one_schema_user
的用户。
在我的数据库中,我有两个模式:public
和sample
如何使这个用户只能看到sample
?
这是我所做的:
GRANT USAGE ON SCHEMA sample TO just_one_schema_user
REVOKE ALL PRIVILEGES ON SCHEMA public FROM just_one_schema_user
但是用户仍然可以列出public
中的表并查看它们的结构。
正如Islingre所评论的那样,没有好的方法可以将这些信息从用户中隐藏。
你必须拒绝用户访问pg_class
、pg_namespace
和pg_proc
等表。如果你将allow_system_table_mods
设置为on
,PostgreSQL将继续运行,但很多东西将不再工作:
使用psql
实用程序命令,如\d
或\dt
其他工具的类似工具
监控系统
基本上,你将无法再看到任何元数据了。
没有办法让用户只查看部分元数据,它要么全部显示,要么全部隐藏。
但这不是问题。没有充分的理由阻止任何人查看元数据--那是公共信息。
PostgreSQL并不认为这是一个安全问题。仅仅因为我知道有一个名为customer
的表,其中包含一个名为credit_card_number
的列,并不能让我更接近访问它,如果权限设置正确的话。
public
中的对象:撤销从未授予的权限将默默地不做任何操作。
在模式public
上的USAGE
权限被授予给PUBLIC
,而不是just_one_schema_user
。
使用以下命令在psql
中显示权限信息:
\dn+
你正在寻找:
REVOKE CREATE, USAGE ON SCHEMA public FROM public;
public
中,只存储扩展程序。然后不要撤销USAGE
,只撤销CREATE
。
pg_catalog
中,您无法撤销对此模式的权限,因为用户将失去查找任何模式下对象的能力。 - Islingrepg_catalog
是正确的。然而,问题是关于public
的。 - Laurenz Albepg_catalog
,我应该能够看到模式,不是吗?我不确定,但如果撤销其他模式的权限会影响对目录的查询,那我会感到惊讶。 - Islingre