如何在PostgreSQL中创建只读用户?

3

我想在PostgreSQL中创建一个只读用户。

目的是创建一个公共可访问的数据浏览器,用户可以编写自定义SQL查询。

以下是创建用户的步骤:

CREATE USER MyReadOnlyUser WITH ENCRYPTED PASSWORD 'MY_WEAK_PASSWORD';

GRANT ALL PRIVILEGES ON DATABASE "MY_DB_NAME" to MyReadOnlyUser;

GRANT ALL ON SCHEMA public TO MyReadOnlyUser; 
GRANT SELECT ON ALL TABLES IN SCHEMA public TO MyReadOnlyUser; 

意图是给用户对所有表进行SELECT访问,然后在敏感表上撤销SELECT访问权限,然后用户可以使用该db用户运行自定义查询,无需我清理输入。特别地,他不能进行插入、删除、截断、删除表、删除数据库、创建表、创建函数/存储过程、查看/执行/创建/删除存储过程/函数等操作。所以,现在我的问题是:为什么该用户可以访问information_schema?它没有被授予任何视图的访问权限,也没有访问模式information_schema...

1
建议使用"grant connect on database my_db_name to myreadonlyuser."代替"GRANT ALL PRIVILEGES ON DATABASE "MY_DB_NAME" to MyReadOnlyUser;"。 - francs
@francs:是的,那听起来更合理一些 ;) - Stefan Steiger
在此处了解更多信息:https://dev59.com/fXRA5IYBdhLWcg3w_C8w - Stefan Steiger
1个回答

2

为什么这个用户可以访问information_schema?

我认为缺省情况下,PUBLIC被授予了对information_schema的选择权限。

您应该可以执行以下操作:

revoke all on all tables in schema information_schema from public;

你可能还需要撤销pg_catalog模式中视图/表的选择权限。但是,如果例如psql或其他客户端工具无法访问该信息,我不确定这会导致什么问题。


1
也许创建一个角色会很有用,比如 ro_user,授予/撤销所有必要的权限,然后将其授予只读用户。 - vyegorov
1
@vyegorov:在这里:http://gkoenig.wordpress.com/2010/01/22/create-a-read-only-user-in-postgres-for-all-relations-in-several-schemas/。 - Stefan Steiger

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