根据我阅读的有关权限的信息,我了解到在将任何权限分配给角色之前撤销权限是很好的做法。 我正在与 1 位名为 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;
我这样做是希望自动删除附加到任何新添加的用户的任何特权,这些特权是公共(public)角色成员资格的一部分。相反,我收到了一个错误,内容是 appuser 没有该架构的权限。然而,这是我对这个错误的误解。 1. PgAdminIII 在该架构的组角色下不显示公共(public)角色 2. appuser 似乎不是名为 public 的组的成员(因为它不存在于界面中)。 3. appuser 的权限被明确授予,即使它是公共(public)角色的一部分
那么...是否有某种名为“公共(public)”的隐式组角色正在影响该用户的权限?我不明白发生了什么事。我还尝试找出从 pgAdminIII 命令行显示组角色成员资格的位置,但也没有成功。顺便说一句,为了修复它,我只是反转了第一个命令(即将 SCHEMA PUBLIC 上的所有权限授予 GROUP PUBLIC);然而,这基本上撤销了我最初想做的事情(即简单地锁定表格)。
有什么想法吗?
更新:我有一种预感,我发现了问题可能是什么。我认为 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 对表拥有的所有权限。
关于postgresql - 锁定 PostgreSQL 中的公共(public)组角色,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20413183/