psql:FATAL:用户“dev”的对等身份validation失败

当我创build一个新的用户,但它不能login数据库。
我这样做:

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 

然后创build一个数据库:

 postgres@Aspire:/home/XXX$ createdb -O dev test_development 

之后,我尝试psql -U dev -W test_developmentlogin,但是得到错误:

 psql: FATAL: Peer authentication failed for user "dev" 

我试图解决问题,但失败了。

尝试:

 psql user_name -h 127.0.0.1 -d db_name 

哪里

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

然后通过Postgresql而不是Unix域套接字连接评估为“networking”连接,因此不会像在pg_hba.conf看到的那样将其评估为“本地”连接:

 local all all peer 

您的连接失败,因为默认情况下, psql通过使用peer身份validation的UNIX套接字进行连接,这要求当前的UNIX用户具有与psql相同的用户名。 因此,您将不得不创buildUNIX用户dev ,然后以dev身份login或使用sudo -u dev psql test_development访问数据库(并且psql不应要求input密码)。

如果你不能或不想创buildUNIX用户,就像你只是想连接到你的数据库进行即席查询,用psql --host=localhost --dbname=test_development --username=dev强制一个套接字连接psql --host=localhost --dbname=test_development --username=dev (正如@meyerson的回答所指出的那样)将解决你眼前的问题。

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

 # TYPE DATABASE USER ADDRESS METHOD local all all peer 

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

  • md5意味着它总是要求input密码,并在MD5散列之后进行validation。

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

如果PostgreSQL正在运行,更改pg_hba.conf后,需要重新读取configuration( pg_ctl reload )或重新启动( sudo service postgresql restart )来重新读取configuration。

* pg_hba.conf文件很可能位于/etc/postgresql/9.x/main/pg_hba.conf

编辑: @Chloe,@JavierEH,@Jonas Eicher,@fccoelho,@Joanis,@Uphill_What评论纳入回答。

对等身份validation意味着postgres向操作系统询问您的login名并将其用于身份validation。 要在postgres上使用同行authentication作为用户“dev”login,您也必须是操作系统上的用户“dev”。

您可以在Postgresql文档中find身份validation方法的详细信息。

提示:如果再没有validation方法工作,请断开服务器与networking的连接,对“localhost”使用方法“trust”(并在方法“trust”启用时再次检查您的服务器是否无法通过networking访问)。

当你指定:

 psql -U user 

它通过UNIX套接字连接,默认情况下它使用peer身份validation,除非在pg_hba.conf指定,否则。

你可以指定:

 host database user 127.0.0.1/32 md5 host database user ::1/128 md5 

在指定的databaseuser环回接口(包括IPv4和IPv6)上获得TCP / IP连接。

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

 service postgresql restart 

重新加载应按以下方式进行:

 pg_ctl reload 

但命令可能会有所不同,具体取决于PATHconfiguration – 您可能必须指定绝对path,这可能是不同的,这取决于postgres的安装方式。

那么你可以使用:

 psql -h localhost -U user -d database 

通过TCP / IP使用该userlogin到指定的databasemd5代表encryption的密码,而您也可以在授权过程中为纯文本密码指定password 。 只要数据库服务器只能在本地访问,没有networking访问,这两个选项就不应该是一件很重要的事情。

重要说明: pg_hba.conf定义顺序非常重要 – 规则是从上到下读取的,就像iptables一样,所以您可能希望在规则上面添加build议的规则:

 host all all 127.0.0.1/32 ident 

虽然@ flaviodesousa的答案是可行的,但是它也强制所有用户(其他人)input密码。

某些时候,为其他人保持对等身份validation是有道理的,但对于服务用户来说是个例外。 在这种情况下,你会想要添加一行到pg_hba.conf,如下所示:

 local all some_batch_user md5 

我build议你在注释的标题行下面添加这行:

 # TYPE DATABASE USER ADDRESS METHOD local all some_batch_user md5 

您将需要使用重新启动PostgreSQL

 sudo service postgresql restart 

如果你使用9.3,你的pg_hba.conf很可能是:

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

当我碰到它的时候,这对我有用:

 sudo -u username psql 

最简单的解决scheme:

 CREATE USER dev WITH PASSWORD 'dev'; CREATE DATABASE test_development; GRANT ALL PRIVILEGES ON DATABASE test_development to dev; ALTER ROLE dev CREATEROLE CREATEDB; 

在我的情况下,我正在使用不同的端口。 默认是5432.我正在使用5433.这对我工作:

 $ psql -f update_table.sql -d db_name -U db_user_name -h 127.0.0.1 -p 5433