出现错误:尝试使pgsql与rails配合使用时,用户“ postgres”的对等身份验证失败


735

我收到错误消息:

FATAL: Peer authentication failed for user "postgres"

当我尝试使Postgres与Rails一起使用时。

这是我的pg_hba.conf,我的database.yml完整记录转储

我在pg_hba中将身份验证更改为md5,并尝试了其他方法,但似乎没有任何效果。

我还尝试根据Rails 3.2致命创建新用户和数据库:用户的对等身份验证失败(PG :: Error)

但是它们甚至在我运行时都没有出现在pgadmin上sudo -u postgres psql -l

知道我哪里出错了吗?


1
1):确保您创建了一个名为“ postgres”的用户,并且已经在数据库上拥有权限2):确保他具有密码3):确保您的config / database.yml包含权限凭证(用户名+密码)
MrYoshiji 2013年

2
需要
到处将对

13
另请参见此答案 -连接可能会失败,localhost但会成功127.0.0.1
uvsmtid 2015年

9
在我来说,我需要添加host: localhost的在database.yml文件中。
Mihail Velikov

Answers:


1027

问题仍然出在您的pg_hba.conf文件(/etc/postgresql/9.1/main/pg_hba.conf*)。

这行:

local   all             postgres                                peer

应该:

local   all             postgres                                md5

*如果找不到此文件,则运行locate pg_hba.conf应会向您显示文件的位置。

更改此文件后,不要忘记重新启动PostgreSQL服务器。如果您使用的是Linux,那就是sudo service postgresql restart

根据有关身份验证方法的PostgreSQL官方文档,这是这两个选项的简要说明。

对等身份验证

对等身份验证方法的工作原理是从内核获取客户端的操作系统用户名,并将其用作允许的数据库用户名(具有可选的用户名映射)。仅本地连接支持此方法。

密码认证

基于密码的身份验证方法为md5和password。除了通过连接发送密码的方式(分别为MD5哈希和明文)外,这些方法的操作方式相似。

如果您完全担心密码“嗅探”攻击,则首选md5。如果可能,应始终避免使用纯密码。但是,md5不能与db_user_namespace功能一起使用。如果连接受SSL加密保护,则可以安全地使用密码(尽管SSL证书身份验证可能取决于使用SSL,这是一个更好的选择)。

的样本位置pg_hba.conf
/etc/postgresql/9.1/main/pg_hba.conf


50
更改此设置后,您需要重新加载/etc/init.d/postgresql reload
Postgresql

78
将其放在此处,因为我总是忘记了此文件的位置/etc/postgresql/9.1/main/pg_hba.conf
Doug

12
@funkotron至少在我的ElementaryOS(Ubuntu)安装中sudo service postgreql restart也可以使用。
Marnen Laibow-Koser 2014年

13
要回答我自己的问题:“对等”身份验证意味着postgres向操作系统询问您的登录名,并使用该名称进行身份验证,因此OS和postgres上的用户必须相同。“ md5”使用加密的密码身份验证。
丹尼斯

9
我了解变化。但是,为什么这不是默认行为?使用md5有什么缺点吗?
Victor Marconi 2015年

361

安装Postgresql之后,我执行了以下步骤。

  1. 打开pg_hba.confUbuntu 文件,将其/etc/postgresql/9.x/main更改为:

    本地所有postgres同行

    本地所有Postgres信任
  2. 重新启动服务器

    $ sudo service postgresql restart
  3. 登录到psql并设置密码

    $ psql -U postgres
    db> ALTER USER postgres with password 'your-pass';
    
  4. 最后pg_hba.conf

    本地所有Postgres信任

    本地所有postgres md5

重新启动postgresql服务器后,您可以使用自己的密码访问它

身份验证方法详细信息:

信任-可以连接到服务器的任何人都有权访问数据库

peer-使用客户端的操作系统用户名作为数据库用户名来访问它。

md5-基于密码的身份验证

以获得更多参考,请点击这里


17
将方法更改为“信任”对我有用。+1用于说明身份验证方法的详细信息。
La-comadreja 2014年

4
在OS X homebrew上,默认设置为“信任”,而在Ubuntu上,默认设置为“对等”,这导致我的设置与我的同事之间存在差异。我们将其更改为MD5,这无济于事,因此“信任”才是真正的答案(我们仅在进行开发测试)。应该得到更多的投票。
xji 2014年

2
您还可以从一开始就在
各处

2
这种方式为我工作,首先不是使用md5方法。
sianipard

需要使用相同的密码? sudo passwd postgres
彼得·克劳斯

211

如果通过localhost(127.0.0.1)连接,则不应遇到该特定问题。我不会对pg_hba.conf感到厌烦,但是我会调整您的连接字符串:

psql -U someuser -h 127.0.0.1 database

其中someuser是您要连接的用户,而database是该用户有权连接的数据库。

这是我在Debian上设置postgres的操作:

http://www.postgresql.org/download/linux/debian/  (Wheezy 7.x)

as root 

    root@www0:~# echo "deb http://apt.postgresql.org/pub/repos/apt/ wheezy-pgdg main" >> /etc/apt/sources.list

    root@www0:~# wget --quiet -O - https://www.postgresql.org/media/keys/ACCC4CF8.asc | apt-key add -

    root@www0:~# apt-get update

    root@www0:~# apt-get install postgresql-9.4        

    root@www0:~# su - postgres 

    postgres@www0:~$ createuser --interactive -P someuser
    Enter password for new role:
    Enter it again:
    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) n

    postgres@www0:~$ createdb -O someuser database

    postgres@www0:~$ psql -U someuser -h 127.0.0.1 database

请享用!


16
我认为这是最好的解决方案,因为它实际上可以解决本地问题,而不会像其他答案所建议的那样混乱而不会使全局配置混乱。
jeteon

1
我必须host: 127.0.0.1从config / database.yml中的默认值更改为localhost-它在同一台计算机上,所以我不明白为什么
安东尼

安东尼,您是说您经历了连接失败,直到您在database.yml中将localhost调整为127.0.0.1为止?如果是这种情况,建议您检查/ etc / hosts文件。否则,可能与解析本地主机有关。
StylusEater

1
与使用本地对等身份验证方法比较时,这要优雅得多。
mdh

1
到目前为止,这是IMO的最佳解决方案
Salil Junior

45

这对我有用!

sudo -u postgres psql

只要您当前登录的用户在sudoers文件中,此方法就可以正常工作。
Abubacker Siddik

16

如果有问题,则需要找到pg_hba.conf。该命令是:

find / -name 'pg_hba.conf' 2>/dev/null

然后更改配置文件:

PostgreSQL 9.3

PostgreSQL 9.3

PostgreSQL 9.4

PostgreSQL 9.3

下一步是:重新启动数据库实例:

service postgresql-9.3 restart

如果有任何问题,则需要再次设置密码:

ALTER USER db_user with password 'db_password';


16
  1. 转到此/etc/postgresql/9.x/main/并打开pg_hba.conf文件

就我而言:

$>  sudo nano /etc/postgresql/9.3/main/pg_hba.conf
  1. md5替换对等

因此,它将更改为:

通过Unix域套接字本地所有postgres对等体进行数据库管理登录

# TYPE  DATABASE        USER            ADDRESS                 METHOD

# "local" is for Unix domain socket connections only
local   all             all                                     peer
# IPv4 local connections:
host    all             all             127.0.0.1/32            md5

这个:

通过Unix域套接字本地所有postgres md5进行数据库管理登录

# TYPE  DATABASE        USER            ADDRESS                 METHOD

# "local" is for Unix domain socket connections only
local   all             all                                     md5
# IPv4 local connections:
host    all             all             127.0.0.1/32            md5
  1. 然后重启pg服务器:

    $> sudo服务postgresql重新启动

以下是用于与postgres连接的方法的列表:

# METHOD can be "trust", "reject", "md5", "password", "gss", "sspi",
# "krb5", "ident", "peer", "pam", "ldap", "radius" or "cert".  Note that
# "password" sends passwords in clear text; "md5" is preferred since
# it sends encrypted passwords.

注意:如果您还没有创建postgres用户。创建该文件,现在您可以使用该用户凭据访问postgres服务器。

提示:如果postgres重新启动后仍然无法使用,请关闭终端,然后再次打开。



10

我有同样的问题。

depa的解决方案是绝对正确的。

只需确保您已将用户配置为使用PostgreSQL。

检查文件:

$ ls /etc/postgresql/9.1/main/pg_hba.conf -l

该文件的权限应授予您向其注册psql的用户。

进一步。如果你到目前为止还好..

按照@depa的说明进行更新。

$ sudo nano /etc/postgresql/9.1/main/pg_hba.conf

然后进行更改。


我面临着同样的问题。但是我不知道需要什么权限。你能帮助我吗。我得到了“ls”的命令输出-rw-r----- 1 postgres postgres 4640 Jun 16 09:59 /etc/postgresql/9.5/main/pg_hba.conf
太阳

8

如果要保留默认配置,但要通过一个特定用户/数据库连接的套接字连接进行md5身份验证,请在“本地所有/所有”行之前添加“本地”行:

# TYPE  DATABASE     USER         ADDRESS             METHOD

# "local" is for Unix domain socket connections only
local   username     dbname                           md5  # <-- this line
local   all          all                              peer
# IPv4 local connections:
host    all          all          127.0.0.1/32        ident
# IPv6 local connections:
host    all          all          ::1/128             ident

此答案中的“之前”应在其他答案中进行更多阐述。事实证明,psql按docs所述顺序检查pg_hba.conf文件中的记录:postgresql.org/docs/11/static/auth-pg-hba-conf.html
eaydin

#TYPE DATABASE USER ADDRESS METHOD本地用户名dbname md5#<-此行顺序不正确
Kiry Meas

7

我正在移动克隆服务器上的数据目录,无法以postgres身份登录。像这样重置postgres密码对我有用。

root# su postgres
postgres$ psql -U postgres
psql (9.3.6) 
Type "help" for help. 
postgres=#\password 
Enter new password: 
Enter it again: 
postgres=#

6

在我确定制作完这些文件后需要重新启动postgres服务器之后,以上编辑对我来说有效。对于ubuntu:

sudo /etc/init.d/postgresql restart

6

将METHOD 对等体更改为信任 pg_hba.conf(/etc/postgresql/9.1/main/pg_hba.conf |第85行)可以解决此问题。添加md5要求输入密码,因此,如果需要避免使用密码,请使用trust而不是md5



5

下面的命令对我有用:

psql -d myDb -U username -W

man psql-W --password Force psql to prompt for a password before connecting to a database. This option is never essential, since psql will automatically prompt for a password if the server demands password authentication. However, psql will waste a connection attempt finding out that the server wants a password. In some cases it is worth typing -W to avoid the extra connection attempt.
Yaroslav Nikitenko 2015年

3

您只需要设置METHOD即可信任。

#TYPE  DATABASE        USER            ADDRESS                 METHOD
local    all             all                                     trust

并重新加载postgres服务器。

# service postgresql-9.5 reload

pg_hba.conf中的更改不需要重新启动postgres服务器。只是重新加载。


3

其他许多答案都与各种配置文件中的设置有关,与答案有关的答案pg_hba.conf确实适用,并且100%正确。但是,请确保您正在修改正确的配置文件

正如其他人提到的那样,可以使用主配置文件内的各种设置来覆盖配置文件的位置,以及在命令行中使用该-D选项提供指向主配置文件的路径。

在psql会话中,可以使用以下命令来显示正在读取配置文件的位置(假设可以启动psql)。这只是一个故障排除步骤,可以帮助某些人:

select * from pg_settings where setting~'pgsql';  

您还应确保postgres用户的主目录位于您期望的位置。我之所以这样说,是因为您的提示将显示' ~'而不是主目录的实际路径,这很容易忽略,因此不太明显。许多安装将postgres用户主目录默认为/var/lib/pgsql

如果未将其设置为应有的设置,请以root用户身份登录时停止postgresql服务并使用以下命令。还要确保postgres用户没有登录到另一个会话:

usermod -d /path/pgsql postgres

最后,通过键入来确保正确设置了PGDATA变量echo $PGDATA,该变量应输出类似以下内容:

/path/pgsql/data

如果未设置或显示与预期不同的内容,请检查启动文件或RC文件(例如.profile或.bash.rc),具体取决于您的操作系统和外壳,它们的差异很大。为计算机确定正确的启动脚本后,可以插入以下内容:

export PGDATA=/path/pgsql/data

对于我的系统,我将其放置在/etc/profile.d/profile.local.sh其中,以便所有用户均可使用。

现在,您应该能够像往常一样初始化数据库,并且所有psql路径设置都应该正确!


3

pg_config用于提供编译信息,以帮助扩展和客户端程序针对PostgreSQL进行编译和链接。它对机器上的活动PostgreSQL实例一无所知,仅对二进制文件一无所知。

pg_hba.conf可以出现在许多其他地方,具体取决于安装Pg的方式。标准位置是数据库的data_directory中的pg_hba.conf(可以位于/ home,/ var / lib / pgsql,/ var / lib / postgresql / [version] /,/ opt / postgres /等)中。但是用户和打包者可以将其放置在任意位置。不幸。

查找pg_hba.conf的唯一有效方法是询问正在运行的PostgreSQL实例pg_hba.conf所在的位置,或询问sysadmin位置。您甚至不必依靠询问datadir在哪里并解析postgresql.conf,因为启动Pg时初始化脚本可能会传递-c hba_file = / some / other / path之类的参数。

您要做的是询问PostgreSQL:

SHOW hba_file;

该命令必须在超级用户会话上运行,因此对于shell脚本编写,您可能会编写如下内容:

psql -t -P format=unaligned -c 'show hba_file';

并设置环境变量PGUSER,PGDATABASE等,以确保连接正确。

是的,这有点像鸡和鸡蛋的问题,因为如果用户无法连接(例如,在修改pg_hba.conf进行编辑之后),则无法找到pg_hba.conf进行修复。

另一个选择是查看ps命令的输出,并查看postmaster数据目录参数-D在此处是否可见,例如

ps aux  | grep 'postgres *-D'

因为pg_hba.conf将位于数据目录内(除非您使用Debian / Ubuntu或某些派生工具并使用其软件包)。

如果您要专门针对从Debian / Ubuntu软件包安装了PostgreSQL的Ubuntu系统,它会变得容易一些。您无需处理手动编译的源Pg,即某人的initdb在其主目录中为其提供了一个datadir,也无需处理在/ opt中安装的EnterpriseDB Pg等。您可以询问pg_wrapper,Debian / Ubuntu multi -版本Pg管理器,其中PostgreSQL使用pg_wrapper中的pg_lsclusters命令。

如果无法连接(Pg未运行,或者需要编辑pg_hba.conf进行连接),则必须在系统中搜索pg_hba.conf文件。在Mac和Linux上,诸如sudo find / -type f -name pg_hba.conf之类的东西会起作用。然后检查同一目录中的PG_VERSION文件,以确保它是正确的PostgreSQL版本(如果有多个版本)。(如果pg_hba.conf在/ etc /中,请忽略它,它是父目录名)。如果同一PostgreSQL版本有多个数据目录,则必须查看数据库大小,请从ps检查正在运行的postgres的命令行,以查看其数据目录-D参数是否与您编辑的位置匹配,等等。 。 /ubuntu/256534/how-do-i-find-the-path-to-pg-hba-conf-from-the-shell/256711


2

我的问题是我没有键入任何服务器。我认为这是默认值,因为有占位符,但是当我键入localhost时它确实起作用了。


2

如果您尝试在Cloud 9中找到此文件,则可以执行

sudo vim /var/lib/pgsql9/data/pg_hba.conf

I编辑/插入,按ESC3次,然后键入,:wq将保存文件并退出


2

如果您使用Rails遇到此问题,并且知道您已经使用密码和正确的权限创建了该用户名,则只需在database.yml文件的末尾添加以下内容。

host: localhost

整体文件如下所示

development:
  adapter: postgresql
  encoding: unicode
  database: myapp_development
  pool: 5
  username: root
  password: admin
  host: localhost

您根本不需要触摸pg_hba.conf文件。快乐编码


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.