Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/apache-flex/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
锁定PostgreSQL中的公共组角色_Postgresql_Permissions_Database Administration - Fatal编程技术网

锁定PostgreSQL中的公共组角色

锁定PostgreSQL中的公共组角色,postgresql,permissions,database-administration,Postgresql,Permissions,Database Administration,根据我一直阅读的有关特权的信息,我了解到在为角色分配任何特权之前撤销特权是很好的。 我有一个与我一起工作的名为appuser的用户,我执行了以下操作: REVOKE ALL PRIVILEGES ON SCHEMA PUBLIC FROM GROUP PUBLIC; GRANT SELECT ON public.table1 TO appuser; GRANT SELECT ON public.table1_id_seq TO appuser; GRANT SELECT ON

根据我一直阅读的有关特权的信息,我了解到在为角色分配任何特权之前撤销特权是很好的。 我有一个与我一起工作的名为appuser的用户,我执行了以下操作:

REVOKE ALL PRIVILEGES ON SCHEMA PUBLIC FROM GROUP PUBLIC;

GRANT SELECT
  ON public.table1 TO appuser;

GRANT SELECT
  ON public.table1_id_seq TO appuser;

GRANT SELECT
  ON public.table2 TO appuser;

GRANT SELECT
  ON public.table2_id_seq TO appuser;
我这样做是希望删除任何附加到任何新添加用户的特权,自动成为公共角色成员的一部分。相反,我得到了一个错误,大意是appuser没有对架构的权限。然而这是我对这个错误的误解。 1.PgAdminIII未在此架构的组角色下显示公共角色 2.appuser似乎不是名为public的组的成员(因为接口中不存在该组)。 3.appuser的权限被显式授予,即使它是公共角色的一部分

那么…是否存在某种称为“Public”的隐式组角色影响该用户的权限?我不明白发生了什么事。我还试图从pgAdminIII命令行找到在哪里显示组角色成员身份,但也没有找到。为了解决这个问题,我简单地反转了第一个命令(即将schemapublic上的所有特权授予grouppublic);但是,这基本上取消了我最初尝试的操作(即简单地锁定表)

有什么想法吗


更新:我有预感,我发现了问题所在。我认为appuser没有该模式的权限。如果我没有弄错的话,在访问模式下的任何对象之前,必须授予模式权限。

好的,所以这里的答案有点复杂,为什么事情会这样,在某种程度上可能值得讨论PostgreSQL安全模型

PUBLIC
不是角色或组,而是保留字。权限的工作方式是应用授予当前继承角色或
PUBLIC
的访问权限。事实上,在过去我构建包装PostgreSQL角色的框架时,我已经被这一点所困扰

总的来说,我的观点是,您希望做以下工作:

  • 不要让所有人都登录数据库

    REVOKE CONNECT ON DATABASE mydb FROM public;
    
  • 您可能还想从public撤销对架构和表的访问

  • 我认为您所做的是另外一件事,那就是从模式(而不是模式中的表!)中撤销权限,并因此保留对该模式中表的默认权限的公共访问权。这可能不是你想要的。无论如何,正如您发现的那样,您需要向架构添加回权限才能回到您所在的位置

  • 现在我不完全确定你在这里想做什么。如果要完全锁定数据库,还需要对所有表执行相同的操作。否则,如果您:

     CREATE USER foo;
     GRANT USAGE ON SCHEMA PUBLIC TO foo;
    

    然后foo将有权访问PUBLIC在表上拥有的所有权限。

    如果错误表明角色没有架构权限,为什么不授予架构上的
    appuser
    ?毕竟,你为每个人撤销了这些命令,却不给任何人。你需要展示你执行的确切命令和你得到的确切错误,而不是对它们的叙述性解释。@Milen-我认为你一针见血。真是个爱拍额头的人。我将在上午测试这个@Peter-在我发布这个命令之后,我实际上正在寻找命令。因为这是我继承的一个迁移过程,所以我仍在学习所有部分的位置。在做了更多的研究之后,我会发布一个更新。