创建PostgreSQL只读用户出错:ERROR: permission denied for relation _foo。

3
我在创建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;

我阅读了这篇文章 如何在PostgreSQL中创建只读用户,但是对于将要创建的表格它要么没有起作用,要么我尝试过了。
有关更多详细信息和完整脚本,请查看 pastebin http://pastebin.com/psDifhwd

我研究了你的pastebin链接,实际授权权限发生在第一个评论中引用的另一个pastebin中:http://pastebin.com/FDnt6EhS。这个文件的内容应该***在***你的问题中。链接会失效,然后你的问题就没有意义了。请编辑。 - Erwin Brandstetter
1个回答

0
我的怀疑是所有用户的search_path都设置为典型的默认值。
"$user",public

这意味着没有模式限定的_foo将解析为$user._foo
  • ckan_defaultckan_default._foo,以及
  • readonlyuserreadonlyuser._foo

请重复您的测试:

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中的默认设置。

更多相关答案:


谢谢您的帮助,但似乎这不是一个search_path问题。ckan_default可以看到public._foo,但readonlyuser看不到。$ sudo -u postgres psql -d datastore_default -U readonlyuser -c 'SELECT * FROM public._foo' 错误:模式public的权限被拒绝 行1:从public._foo选择* - ddreian
如果我使用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 更多细节请参见http://pastebin.com/CVdHURPJ。有什么线索吗? - ddreian
sudo -u postgres dropuser readonlyuser 似乎与readonlyuser相关的一些特权仍然存在 dropuser:删除角色“readonlyuser”失败:错误:无法删除角色“readonlyuser”,因为某些对象依赖于它 详细信息:属于架构公共的新关系的默认特权的特权 属于ckan_default角色的新关系的默认特权在架构public中 公共模式的特权 数据库datastore_default的特权 数据存储库中的4个对象 - ddreian

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