我认为有一个简单的 Postgres 身份验证要求,但我无法弄清楚如何pg_hba.conf
使其发挥作用。
我有一个名为的数据库用户(角色)dbuser
,它是受密码保护的数据库的所有者adb
。有一个名为的对应 Unix 用户dbuser
。Unix 用户dbuser
应该能够adb
在没有密码的情况下连接到,所有其他 Unix 用户都应该能够通过使用角色dbuser
并提供数据库密码进行连接。即
sudo -u dbuser psql -U dbuser adb
不需要数据库密码,但是
sudo -u any_other_user psql -U dbuser adb
应该需要数据库密码。
入口pg_hba.conf
:
local adb dbuser peer
在第一种情况下有效,但在第二种情况下失败(psql:FATAL:用户“dbuser”的对等身份验证失败)。我理解原因,但无法找出正确的规则来做我想做的事情。仅限 Unix 套接字连接(本地)。如果有所不同,请使用 Postgres 9.2。
答案1
PostgreSQL 当前的身份验证方案无法实现您的期望。当peer
身份验证失败时,PostgreSQL 不会转到 中的下一个条目pg_hba.conf
。仅使用第一个条目,如果失败,则拒绝连接。peer
如果用户 ID 不匹配,该模式不提供回退到密码身份验证的选项。
所以你不能这样做。抱歉。你能想到的最接近的方法是使用local
(unix 套接字) 连接进行peer
身份验证,并要求其他客户端通过 TCP/IP ( host
) 套接字进行md5
身份验证。使用不同的协议可以为每个客户端选择不同的身份验证方法。
我最近提议对 pgsql-hackers 上的身份验证行为进行更改,如果我能说服人们这是一个好主意,那么在以后的版本中可能会允许你想要的操作。基本上,如果身份验证失败,该peer
模式将采用一个md5_fallback
选项,允许它向客户端请求密码peer
。