创建 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._foo
为readonlyuser
。
重复您的测试:
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 的权限被拒绝的主要内容,如果未能解决你的问题,请参考以下文章