尝试在PostgreSQL中创建只读用户时遇到问题。
我希望用户ckan_default在数据库datastore_default中创建表。 我希望readonlyuser在datastore_default中读取由ckan_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
答案 0 :(得分:0)
我怀疑所有用户的seach_path
都设置为典型的默认值
"$user",public
这意味着没有架构资格的_foo
会解析为$user._foo
-
ckan_default._foo
和ckan_default
readonlyuser._foo
readonlyuser
的{{1}}。
用以下方法重复测试:
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
中的默认设置。
更多相关答案: