锁定PostgreSQL中的公共组角色
根据我一直阅读的有关特权的信息,我了解到在为角色分配任何特权之前撤销特权是很好的。 我有一个与我一起工作的名为appuser的用户,我执行了以下操作:锁定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
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;
CREATE USER foo;
GRANT USAGE ON SCHEMA PUBLIC TO foo;
然后foo将有权访问PUBLIC在表上拥有的所有权限。如果错误表明角色没有架构权限,为什么不授予架构上的
appuser
?毕竟,你为每个人撤销了这些命令,却不给任何人。你需要展示你执行的确切命令和你得到的确切错误,而不是对它们的叙述性解释。@Milen-我认为你一针见血。真是个爱拍额头的人。我将在上午测试这个@Peter-在我发布这个命令之后,我实际上正在寻找命令。因为这是我继承的一个迁移过程,所以我仍在学习所有部分的位置。在做了更多的研究之后,我会发布一个更新。