如何在 Azure PostgreSQL 中创建只读用户?

如何在 Azure PostgreSQL 中创建只读用户?

如何在 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

我也遇到过很多麻烦,但最终还是解决了。以下是我所做的:

  1. 创建新角色,readonly

    CREATE ROLE readonly WITH LOGIN PASSWORD 'password';
    
  2. 授予数据库连接权限

    GRANT CONNECT ON DATABASE databasename to readonly;
    
  3. 连接到本地数据库群集上的 [数据库名称]

    \c databasename 
    
  4. 授予架构使用权

    GRANT USAGE ON SCHEMA schema_name TO readonly;
    
  5. 授予对所有当前和未来表的 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 PRIVILEGESGRANT SELECT ON ALL...在我以这些架构的所有者身份登录时才有效。当我运行这些命令时,如果我没有以这些架构的所有者身份登录,则没有任何错误消息或任何其他内容,但用户readonly仍然没有足够的访问权限。希望这能有所帮助!

相关内容