创建 PostgreSQL 只读用户错误:关系 _foo 的权限被拒绝

Posted

技术标签:

【中文标题】创建 PostgreSQL 只读用户错误:关系 _foo 的权限被拒绝【英文标题】:Create PostgreSQL read only user ERROR: permission denied for relation _foo 【发布时间】:2014-10-28 07:29:11 【问题描述】:

尝试在 PostgreSQL 中创建只读用户时遇到问题。

我希望用户 ckan_default 在数据库 datastore_default 中创建表。 我希望 readonlyuser 读取由 ckan_default 在 datastore_default 中创建的表。 我希望这条规则适用于将由 ckan_default 创建的表,而不仅仅是已经创建的表。

GRANT CONNECT ON DATABASE datastore_default TO readonlyuser;
GRANT USAGE ON SCHEMA public TO readonlyuser;
GRANT SELECT ON ALL TABLES IN SCHEMA public TO readonlyuser;
ALTER DEFAULT PRIVILEGES FOR USER readonlyuser IN SCHEMA public GRANT SELECT ON TABLES TO readonlyuser;

实际上我运行的完整脚本是

sudo -u postgres psql postgres -f /tmp/set_permissions.sql

--content of /tmp/set_permissions.sql
REVOKE CREATE ON SCHEMA public FROM PUBLIC;
REVOKE USAGE ON SCHEMA public FROM PUBLIC;
GRANT CREATE ON SCHEMA public TO ckan_default;
GRANT USAGE ON SCHEMA public TO ckan_default;
GRANT CREATE ON SCHEMA public TO ckan_default;
GRANT USAGE ON SCHEMA public TO ckan_default;
REVOKE CONNECT ON DATABASE ckan_default FROM readonlyuser;
GRANT CONNECT ON DATABASE datastore_default TO readonlyuser;
GRANT USAGE ON SCHEMA public TO readonlyuser;
GRANT SELECT ON ALL TABLES IN SCHEMA public TO readonlyuser;
ALTER DEFAULT PRIVILEGES FOR USER ckan_default IN SCHEMA public
   GRANT SELECT ON TABLES TO readonlyuser;

我阅读了这篇 How do you create a read-only user in PostgreSQL 的帖子,我要么尝试过,要么它不适用于将要创建的表。

有关更多详细信息和完整脚本,请查看 pastebin http://pastebin.com/psDifhwd

【问题讨论】:

我研究了您的 pastebin 链接,实际授予权限发生在第一个评论中引用的另一个 pastebin 中:pastebin.com/FDnt6EhS。该文件的内容应该是 in 您的问题。链接死了,然后你的问题就不再有意义了。请编辑。 【参考方案1】:

我怀疑所有用户的search_path 设置为典型默认值

"$user",public

这意味着没有架构限定的_foo 将解析为$user._foo

ckan_default._foo 代表 ckan_default,以及 readonlyuser._fooreadonlyuser

重复您的测试:

sudo -u postgres psql -d datastore_default -U ckan_default -c 'CREATE TABLE public._foo()'
sudo -u postgres psql -d datastore_default -U ckan_default -c 'SELECT * FROM public._foo'
sudo -u postgres psql -d datastore_default -U readonlyuser -c 'SELECT * FROM public._foo'

如果是这种情况,请考虑更改每个用户的默认 search_path

ALTER ROLE ckan_default SET search_path=public;
ALTER ROLE readonlyuser SET search_path=public;

或任何适合您的需求。 还可以考虑更改postgresql.conf 中的默认设置。

更多相关答案:

How does the search_path influence identifier resolution and the "current schema" Grant all on a specific schema in the db to a group role in PostgreSQL Grant privileges for a particular database in PostgreSQL

【讨论】:

感谢您的帮助,但看来这不是 search_path 问题。 ckan_default 看到 public._foo 但 readonlyuser 没有。 $ sudo -u postgres psql -d datastore_default -U readonlyuser -c 'SELECT * FROM public._foo' ERROR: permission denied for schema public LINE 1: SELECT * FROM public._foo ^ 如果我用用户 postgres 或 ckan_default 运行 \z 我得到这个 sudo -u postgres psql -d datastore_default -U ckan_default=arwdDxt/ckan_default+| datastore_default=r/ckan_default +| readonlyuser=r/ckan_default | ckan_default=arwdDxt/ckan_default+| datastore_default=r/ckan_default +| readonlyuser=r/ckan_default | 但是 readonlyuser 得到一个空行。 sudo -u postgres psql -d readonlyuser -U 更多细节在这里pastebin.com/CVdHURPJ任何线索? sudo -u postgres dropuser readonlyuser 似乎有一些权限与 readonlyuser 相关联dropuser: removal of role "readonlyuser" failed: ERROR: role "readonlyuser" cannot be dropped because some objects depend on it DETAIL: privileges for default privileges on new relations belonging to role postgres in schema public privileges for default privileges on new relations belonging to role ckan_default in schema public privileges for schema public privileges for database datastore_default 4 objects in database datastore_default

以上是关于创建 PostgreSQL 只读用户错误:关系 _foo 的权限被拒绝的主要内容,如果未能解决你的问题,请参考以下文章

PostgreSQL创建只读用户

PostgreSQL数据库创建只读用户总结

如何在PostgreSQL中建只读账号

PostgreSQL简单添加只读用户的方法

如何在 postgresql 中创建只读视图,类似于 oracle?

在 PostgresQL 中删除角色