如何在 Azure PostgreSQL 中创建只读用户?
在我的本地 postgres 安装中,我可以运行以下命令来创建只读用户:
CREATE USER spqr1 WITH ENCRYPTED PASSWORD 'password';
REVOKE CONNECT ON DATABASE postgres FROM PUBLIC;
CREATE DATABASE mydb;
REVOKE CONNECT ON DATABASE mydb FROM PUBLIC;
GRANT CONNECT ON DATABASE mydb TO spqr1;
\connect mydb
REVOKE ALL PRIVILEGES ON SCHEMA public FROM PUBLIC;
GRANT USAGE ON SCHEMA public TO spqr1;
当我在 Azure PostgreSQL 数据库上运行这些命令时,新用户spqr1
拥有我不想要的权限:他们可以连接到postgres
数据库并在中创建表mydb
。在我的本地计算机上,新用户没有这些权限。
在我看来,似乎有一个默认用户azure_superadmin
被授予了PUBLIC
连接postgres
数据库的权限以及在任何公共架构中创建表的权限。我的管理员帐户 ( meadmin
) 没有授予这些权限,也无法删除它们。这是怎么回事?如果是这样,那么我应该如何创建只读帐户?
以下是修剪后的输出\l
:
Name | Owner | Access privileges
-----------+-----------------+-------------------------------------
mydb | meadmin | =T/meadmin +
| | meadmin=CTc/meadmin +
| | spqr1=c/meadmin
postgres | azure_superuser | =Tc/azure_superuser +
| | azure_superuser=CTc/azure_superuser
template0 | azure_superuser | =c/azure_superuser +
| | azure_superuser=CTc/azure_superuser
template1 | azure_superuser | =c/azure_superuser +
| | azure_superuser=CTc/azure_superuser
\dn+
在我连接到 之后,下面是 的修剪输出mydb
:
Name | Owner | Access privileges
--------+-----------------+------------------------------------
public | azure_superuser | azure_superuser=UC/azure_superuser+
| | =UC/azure_superuser
答案1
我也遇到过很多麻烦,但最终还是解决了。以下是我所做的:
创建新角色,
readonly
CREATE ROLE readonly WITH LOGIN PASSWORD 'password';
授予数据库连接权限
GRANT CONNECT ON DATABASE databasename to readonly;
连接到本地数据库群集上的 [数据库名称]
\c databasename
授予架构使用权
GRANT USAGE ON SCHEMA schema_name TO readonly;
授予对所有当前和未来表的 SELECT 访问权限
ALTER DEFAULT PRIVILEGES IN SCHEMA schema_name GRANT SELECT ON TABLES to readonly; ALTER DEFAULT PRIVILEGES IN SCHEMA schema_name GRANT ALL ON TABLES TO readonly; GRANT SELECT ON ALL TABLES IN SCHEMA schema_name TO readonly; GRANT SELECT ON ALL SEQUENCES IN SCHEMA schema_name TO readonly;
请注意,据我所知,您无法为将来创建的架构创建只读用户。我认为,如果创建了新架构,您将不得不再次授予 select 权限。另请注意,真正让我困惑的一件事是,and 语句ALTER DEFAULT PRIVILEGES
仅GRANT SELECT ON ALL...
在我以这些架构的所有者身份登录时才有效。当我运行这些命令时,如果我没有以这些架构的所有者身份登录,则没有任何错误消息或任何其他内容,但用户readonly
仍然没有足够的访问权限。希望这能有所帮助!