在尝试使用Rails运行pgsql时,出现错误:“Peer authentication failed for user“postgres””。

1180

我遇到了这个错误:

FATAL: Peer authentication failed for user "postgres"

当我尝试让Postgres与Rails配合使用时,遇到了一些问题。

这是我的pg_hba.conf,我的database.yml,以及完整跟踪信息的转储

我在pg_hba中将认证方式更改为md5,并尝试了不同的方法,但都无法解决问题。

我还尝试按照Rails 3.2, FATAL: Peer authentication failed for user (PG::Error)的说明创建新用户和数据库。

但是它们在pgadmin上甚至在我运行sudo -u postgres psql -l时也没有显示出来。

您有什么想法?


1
1):确保您已创建名为“postgres”的用户,并在数据库上拥有权限 2):确保他有密码 3):确保您的config/database.yml包含正确的凭据(用户名+密码) - MrYoshiji
2
需要将每个地方的对等和缩进设置为MD5。 - Artem.Borysov
37
请参考此答案 - 在本地主机上连接可能会失败,但在 127.0.0.1 上成功。 - uvsmtid
14
在我的情况下,我需要在 database.yml 文件中添加 host: localhost - Mihail Velikov
这个链接对我很有帮助:http://suite.opengeo.org/docs/latest/dataadmin/pgGettingStarted/firstconnect.html - Sudip Bhandari
显示剩余2条评论
29个回答

1508

问题仍然出在您的pg_hba.conf文件上*。

是这一行:

local   all             postgres                                peer

应该是:

local   all             postgres                                md5

修改完此文件后,请不要忘记重新启动您的PostgreSQL服务器。如果您使用Linux,则应该是sudo systemctl restart postgresql(在旧系统上:sudo service postgresql restart)。


查找hba.conf

请注意,此文件的位置并不是非常一致。

您可以使用locate pg_hba.conf或询问 PostgreSQL SHOW hba_file; 来发现文件位置。

通常的位置包括/etc/postgresql/[version]/main/pg_hba.conf/var/lib/pgsql/data/pg_hba.conf


以下是根据官方PostgreSQL身份验证文档描述中的peermd5选项的简要说明。

Peer身份验证

对于本地连接,Peer身份验证方法通过从内核获取客户端操作系统用户名并将其用作允许的数据库用户名(带有可选用户名映射)的方式来运行。此方法仅支持本地连接。

密码身份验证

基于密码的身份验证方法为md5和password。这些方法的操作方式相似,只是密码在连接中发送的方式不同,即分别以MD5哈希和明文形式。

如果您有任何关于密码“嗅探”攻击的顾虑,则建议使用md5。应尽可能避免使用明文密码。但是,如果连接受到SSL加密保护,则可以安全地使用密码(虽然如果依赖于使用SSL,则SSL证书身份验证可能是更好的选择)。


76
更改此设置后,您需要重新加载postgresql服务:/etc/init.d/postgresql reload - funkotron
88
我会尽力完成翻译。以下是需要翻译的内容:"putting this here since I always forget where this file is /etc/postgresql/9.1/main/pg_hba.conf"将此放置于此处,因为我总是忘记这个文件的位置:/etc/postgresql/9.1/main/pg_hba.conf - Doug
17
至少在我的ElementaryOS (Ubuntu)上,sudo service postgresql restart也可以工作。 - Marnen Laibow-Koser
19
回答自己的问题:'peer'身份验证意味着PostgreSQL会向操作系统请求您的登录名,并将其用于身份验证,因此操作系统和PostgreSQL上的用户必须相同。'md5'使用加密密码进行身份验证。 - Dennis
13
我理解这个变化,但为什么不把它设为默认行为呢?使用MD5有什么缺点吗? - Victor Marconi
显示剩余19条评论

670
安装完PostgreSQL之后,我进行了以下步骤:
  1. 打开文件pg_hba.conf,对于Ubuntu系统,例如使用/etc/postgresql/13/main$ sudo nano pg_hba.conf,并更改文件底部的这一行,它应该是设置的第一行:

    local   all             postgres                                peer

    local   all             postgres                                trust

    注意:如果您希望也能够使用其他用户连接到数据库,还需要将以下行更改为:

    local   all             all                                peer

    local   all             all                                md5

    如果您使用nano编辑器,请按两下Escape,然后输入xyEnter以保存配置文件。

  2. 重启服务器

 $ sudo service postgresql restart

输出:* 重新启动 PostgreSQL 13 数据库服务器

  • 登录到 psql 并设置您的密码

  •  $ psql -U postgres
     db> ALTER USER postgres with password 'your-pass';
    

    输出:ALTER ROLE

    附注:如果您有其他用户,他们也需要一个密码:

     db> ALTER USER my_user with password 'your-pass';
    

    然后输入:

     exit
    
  • 最后,将 pg_hba.conf 中的内容改为:

    local   all             postgres                                md5

    然后重新启动服务器。

  •  $ sudo service postgresql restart
    

    输出:* 重新启动PostgreSQL 13数据库服务器

  • 使用postgres用户登录psql

    在重新启动PostgreSQL服务器后,postgres用户将接受您选择的密码:

  •  psql -U postgres
    

    输出:
    用户postgres的密码:

    psql(13.4(Ubuntu 13.4-1.pgdg20.04+1))

    键入“help”获取帮助。

    您现在已经进入psql:

    postgres =#

    顺便说一下:如果您已添加了用户和密码,则现在对于my_user也是同样适用的:

     psql -d YOUR_DB_NAME -U my_user
    

    它会要求您输入my_user的新密码。

    身份验证方法的详细信息:

    trust - 允许任何连接到服务器的人都可以访问数据库

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

    md5 - 基于密码的身份验证

    更多参考,请在此处查看


    34
    "将认证方式更改为“信任”对我起了作用。点赞解释认证方法的详细信息。" - La-comadreja
    8
    在OS X homebrew上,默认设置是信任(trust),而在Ubuntu上默认设置为"对等"(peer),这导致我的设置与同事的设置有差异。我们将他的设置更改为MD5,但无济于事,所以"信任"才是真正的答案(我们只进行开发测试)。应该获得更多点赞。 - xji
    2
    你也可以从一开始就设置MD5。 - Artem.Borysov
    2
    这种方法对我有效,使用md5方法则不行。 - sianipard
    需要使用相同的密码吗? sudo passwd postgres - Peter Krauss
    显示剩余8条评论

    347

    如果您通过localhost(127.0.0.1)连接,您不应该遇到特定的问题。我不会对pg_hba.conf进行太多更改,而是会调整您的连接字符串:

    psql -U someuser -h 127.0.0.1 database
    

    在连接数据库时,替换someuser为你要连接的用户名,database为该用户有权限连接的数据库名称。

    以下是我在Debian上设置PostgreSQL的步骤:

    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
    

    享受吧!


    41
    我认为这是最好的解决方案,因为它在不干扰全局配置的情况下实际解决了本地问题,而不像其他答案建议的那样去搞乱全局配置。 - jeteon
    3
    我不得不在config/database.yml中将 host: 127.0.0.1 从默认的localhost更改 - 它在同一台机器上,所以我不明白为什么要这样。 - Anthony
    5
    与干扰本地对等身份验证方法相比,这更加优雅。 - mdh
    2
    这让我再次想起,仅仅在本地主机上运行与告诉psql有所不同。真正的问题是,在*nix操作系统上,psql会尝试通过本地套接字连接,而默认情况下只允许用户postgres进行连接。 - normic
    这个解决方案适用于我在Ubuntu 20上的情况,只需要将选项名称-H更改为大写。 - Lauris
    显示剩余3条评论

    106

    这对我起作用了!!

    sudo -u postgres psql
    

    4
    只要您当前登录的用户在sudoers文件中,这应该可以正常工作。 - Abubacker Siddik

    41
    sudo psql --host=localhost --dbname=database-name --username=postgres
    

    这解决了我的问题


    4
    我没想到会这么简单,但在 Debian 9 下这对我有用。 - Hayden Thring

    25

    如果您遇到问题,需要找到您的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';


    1
    谢谢你的find命令!在Fedora文件浏览器中搜索从未返回过pg_hba.conf。现在我终于可以更新那个文件了。 - JesseBoyd

    24

    23
    1. 进入 /etc/postgresql/9.x/main/ 目录,打开 pg_hba.conf 文件。

    在我的情况下:

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

    因此,更改后的内容如下:

    通过Unix域套接字进行数据库管理登录 local all postgres md5

    # 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域套接字进行数据库管理登录 local所有用户可以使用md5方式登录postgres账户

    # 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 service postgresql restart

    下面列出了用于连接到Postgres的METHODS:

    # 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.
    

    注意: 如果您尚未创建您的PostgreSQL用户,请先创建该用户,现在您可以使用该用户凭据访问PostgreSQL服务器。

    提示: 如果在重启PostgreSQL之后仍然无法正常工作,请关闭终端并重新打开。


    16
    此错误可能是由于未提供主机而引起的。下面的场景类似于这种情况。
    用户@homepc:~$ psql -d test_db -U test_user psql:错误:用户“test_user”的同行身份验证失败 用户@homepc:~$ psql -h localhost -d test_db -U test_user 输入test_user密码:
    在psql命令行中提供主机名可以解决我的问题。尝试在Rails中的PostgreSQL连接配置中提供主机名。

    15

    我正在克隆服务器并移动数据目录,但是登录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=#
    

    网页内容由stack overflow 提供, 点击上面的
    可以查看英文原文,
    原文链接