psql:致命:用户"dev"的对等身份验证失败

hsm*_*ing 186 postgresql

当我创建一个新用户,但它无法登录数据库.
我这样做:

postgres@Aspire:/home/XXX$ createuser dev
Shall the new role be a superuser? (y/n) n
Shall the new role be allowed to create databases? (y/n) y
Shall the new role be allowed to create more new roles? (y/n) y
Run Code Online (Sandbox Code Playgroud)

然后创建一个数据库:

postgres@Aspire:/home/XXX$ createdb -O dev test_development
Run Code Online (Sandbox Code Playgroud)

之后,我尝试psql -U dev -W test_development登录,但得到错误:

psql: FATAL:  Peer authentication failed for user "dev"
Run Code Online (Sandbox Code Playgroud)

我试图解决问题但失败了.

mey*_*son 291

尝试:

psql user_name  -h 127.0.0.1 -d db_name
Run Code Online (Sandbox Code Playgroud)

哪里

  • -h 是本地服务器的主机名/ IP,因此避免使用Unix域套接字
  • -d 是要连接的数据库名称

然后通过Postgresql而不是Unix域套接字连接将其评估为"网络"连接,因此不会将其评估为"本地"连接,如下所示pg_hba.conf:

local   all             all                                     peer
Run Code Online (Sandbox Code Playgroud)

  • 我需要(版本9.4):psql -U user-name -h 127.0.0.1 -d db-name (15认同)
  • 什么是一个ornery工具.手册说`psql [option ...] [dbname [username]]`,所以你认为`psql dbname username`会起作用.. (8认同)
  • 也为我工作过.我还认为这是一种比改变配置文件更好的方法,特别是当你不知道自己在做什么时,只需按照SO回答来解决你的问题. (2认同)
  • 好答案。在以 postgres `\c 词汇表 john` 身份登录后,我从数据库内部获取 `致命:用户“john”` 的对等身份验证失败,然后使用 `\c 词汇表 john localhost` `用户 john 的密码:`SSL 连接(协议:TLSv1.2,密码:ECDHE-RSA-AES256-GCM-SHA384,位:256,压缩:关闭)`你现在在端口的主机“localhost”上以用户“john”的身份连接到数据库“glossary” “5432”。`它起作用了。 (2认同)
  • 为什么需要“-h”?我有需要它的 Postgres 数据库和不需要它的 Postgres 数据库。有什么不同? (2认同)

fla*_*usa 210

您的连接失败,因为默认情况下psql使用peer身份验证连接UNIX套接字,这要求当前UNIX用户具有相同的用户名psql.所以,你必须创建UNIX用户dev,然后登录,dev或用sudo -u dev psql test_development它们来访问数据库(和psql应该要求输入密码).

如果您不想或不想创建UNIX用户,就好像您只想连接到数据库以进行即席查询一样,使用psql --host=localhost --dbname=test_development --username=dev(如@meyerson回答中指出的那样)强制套接字连接将解决您的直接问题.

但是,如果您打算通过Unix套接字而不是对等方法强制进行密码验证,请尝试更改以下pg_hba.conf*行:

# TYPE DATABASE USER ADDRESS METHOD
local  all      all          peer
Run Code Online (Sandbox Code Playgroud)

# TYPE DATABASE USER ADDRESS METHOD
local  all      all          md5
Run Code Online (Sandbox Code Playgroud)
  • peer意味着它将信任UNIX用户的身份(真实性).所以不要求密码.

  • md5意味着它将始终要求输入密码,并在散列后进行验证MD5.

当然,您还可以为特定数据库或用户创建更具体的规则,其中一些用户peer和其他用户需要密码.

更改后pg_hba.conf如果PostgreSQL正在运行,您需要通过重新加载(pg_ctl reload)或重新启动(sudo service postgresql restart)来重新读取配置.

*该文件pg_hba.conf最有可能是/etc/postgresql/9.x/main/pg_hba.conf

编辑: 来自@Chloe,@ JavierEH,@ Jonas Eicher,@ fccoelho,@ Joanis,@ Uphill的评论.评论纳入答案.

  • 你如何允许`peer`*AND*`md5`?当我设置`md5`时,我再也无法使用`postgres`用户登录了!我尝试添加多行,并用逗号分隔方法,但它们不起作用.好的,我找到了`mgoldwasser`的答案,这很有效.我刚用方法`peer`为用户`postgres`添加了另一行! (5认同)
  • 别担心,您可以为特定用户设置对等身份验证(例如,您的用户名或postgres).似乎特定规则覆盖了一般规则 (3认同)
  • 你不能不重启postgresql吗?你不能只在pg_user表中指定身份验证方法吗? (2认同)
  • 您可以重新加载而不是重新启动.那会重新加载pg_hba表.为我工作. (2认同)

ste*_*hke 29

对等身份验证意味着postgres会向操作系统询问您的登录名,并将其用于身份验证.要使用postgres上的对等身份验证以"dev"用户身份登录,您还必须是操作系统上的用户"dev".

您可以在Postgresql文档中找到身份验证方法的详细信息.

提示:如果不再使用身份验证方法,请断开服务器与网络的连接,并使用"trust"方法"localhost"(并在启用方法"trust"时仔细检查您的服务器是否无法通过网络访问).

  • 斯特凡的回答是正确的.我刚刚添加了一个链接,在查看我的编辑时可以看到该链接到解释每种身份验证方法的文档. (2认同)

tym*_*mik 23

当您指定:

psql -U user
Run Code Online (Sandbox Code Playgroud)

它通过UNIX Socket连接,UNIX Socket默认使用peer身份验证,除非pg_hba.conf另有说明.

您可以指定:

host    database             user             127.0.0.1/32       md5
host    database             user             ::1/128            md5
Run Code Online (Sandbox Code Playgroud)

获取指定database和的回送接口(IPv4和IPv6)上的TCP/IP连接user.

更改后,您必须重新启动postgres或重新加载它的配置.重新启动应该在现代RHEL/Debian发行版中工作:

service postgresql restart
Run Code Online (Sandbox Code Playgroud)

重新加载应该以下列方式工作:

pg_ctl reload
Run Code Online (Sandbox Code Playgroud)

但是命令可能因PATH配置而异 - 您可能必须指定绝对路径,这可能会有所不同,具体取决于安装postgres的方式.

然后你可以使用:

psql -h localhost -U user -d database
Run Code Online (Sandbox Code Playgroud)

用它登录user到指定database的TCP/IP. md5代表加密密码,您也可以password在授权期间指定纯文本密码.只要数据库服务器只能在本地访问,没有网络访问权限,这两个选项就不应该是一件大事.

重要说明:pg_hba.conf事项中的 定义顺序- 规则从上到下读取,如iptables,因此您可能希望在规则之上添加建议规则:

host    all             all             127.0.0.1/32            ident
Run Code Online (Sandbox Code Playgroud)


mgo*_*ser 22

虽然@ flaviodesousa的答案可行,但它也强制要求所有用户(其他人)输入密码.

有时候为其他人保留对等身份验证是有意义的,但是为服务用户做出例外.在这种情况下,您需要在pg_hba.conf中添加一行,如下所示:

local   all             some_batch_user                         md5
Run Code Online (Sandbox Code Playgroud)

我建议您在注释标题行的正下方添加此行:

# TYPE  DATABASE        USER            ADDRESS                 METHOD
local   all             some_batch_user                         md5
Run Code Online (Sandbox Code Playgroud)

您需要使用重启PostgreSQL

sudo service postgresql restart
Run Code Online (Sandbox Code Playgroud)

如果您使用的是9.3,那么您的pg_hba.conf很可能是:

/etc/postgresql/9.3/main/pg_hba.conf


小智 12

当我遇到它时,这对我有用:

sudo -u username psql
Run Code Online (Sandbox Code Playgroud)


Ris*_*der 9

我只需要添加 -h localhost


Abe*_*bel 8

最简单的解决方案:

CREATE USER dev WITH PASSWORD 'dev';
CREATE DATABASE test_development;
GRANT ALL PRIVILEGES ON DATABASE test_development to dev;
ALTER ROLE dev CREATEROLE CREATEDB;
Run Code Online (Sandbox Code Playgroud)