获取错误:当试图让pgsql使用rails时,用户"postgres"的对等身份验证失败

ord*_*of1 679 postgresql ruby-on-rails

我收到错误:

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

当我尝试使用Rails进行postgres时.

这是我的pg_hba.conf,我的database.yml,以及完整痕迹转储.

我在pg_hba中将身份验证更改为md5并尝试了不同的操作,但似乎都没有.

我还尝试按照Rails 3.2创建一个新的用户和数据库,致命:用户的对等身份验证失败(PG ::错误)

但他们没有出现在pgadmin上,甚至在我跑步时也没有出现sudo -u postgres psql -l.

知道我哪里错了吗?

dep*_*epa 944

问题仍然是你的pg_hba.conf文件(/etc/postgresql/9.1/main/pg_hba.conf*).这一行:

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

应该

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

*如果找不到此文件,运行/etc/postgresql/9.1/main/pg_hba.conf*时应显示文件的位置.

更改此文件后,请不要忘记重新启动PostgreSQL服务器.如果你在Linux上,那就是locate pg_hba.conf.

这些是根据官方PostgreSQL文档关于身份验证方法的两个选项的简要描述.

对等身份验证

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

密码验证

基于密码的身份验证方法是md5和密码.除了通过连接发送密码的方式外,这些方法的操作类似,分别是MD5散列和明文.

如果你完全担心密码"嗅探"攻击,那么首选md5.如果可能,应始终避免使用普通密码.但是,md5不能与db_user_namespace功能一起使用.如果连接受SSL加密保护,则可以安全地使用密码(但如果依赖于使用SSL,则SSL证书身份验证可能是更好的选择).

样本位置 sudo service postgresql restart

/etc/postgresql/9.1/main/pg_hba.conf

  • 把它放在这里,因为我总是忘记这个文件在哪里`/ etc/postgresql/9.1/main/pg_hba.conf` (76认同)
  • 更改此`/etc/init.d/postgresql reload后,您需要重新加载postgresql服务 (46认同)
  • 回答我自己的问题:'peer'身份验证意味着postgres会向操作系统询问您的登录名并将其用于身份验证,因此操作系统和postgres上的用户必须相同.'md5'使用加密密码验证. (13认同)
  • @funkotron至少在我的ElementaryOS(Ubuntu)安装上,`sudo service postgreql restart`也可以. (12认同)
  • 我理解这种变化.但为什么这不是默认行为?使用md5有什么缺点吗? (8认同)
  • 在CentOS 6.5上,我在`/ var/lib/pgsql/9.1/data`中找到了这个文件 (4认同)
  • 呃,改成md5后要求输入密码……密码是多少? (4认同)
  • 确保你的授权规则在 `pg_hba.conf` 中放在任何其他匹配但拒绝的规则之前*。[作为 PostgreSQL 9.3 关于 `pg_hba.conf` 的文档](http://www.postgresql.org/docs/9.3/static/auth-pg-hba-conf.html) 指出:“*第一条记录带有匹配的连接类型、客户端地址、请求的数据库和用户名用于进行身份验证。没有“失败”或“备份”:如果选择了一条记录并且身份验证失败,则不考虑后续记录。* (3认同)
  • Arivarasan对Artem编辑的回应实际上更好.上面的这个解决方案不起作用,至少对我来说(Elementary OS).看到这个[链接](https://www.postgresql.org/message-id/b9e2597c0905061106o1db54c83gae31f44bf0d27902@mail.gmail.com)对Postgres的支持答案基本上都是这样说的.您需要先将'peer'替换为'trust',然后将其更改为'md5' (2认同)
  • 在 Fedora 上工作,`pg_hba.conf` 位于 `/var/lib/pgsql/data` 下 (2认同)

Ari*_*n L 326

安装Postgresql后,我做了以下步骤.

  1. 打开pg_hba.confUbuntu 文件,它将进入/etc/postgresql/9.x/main并更改此行:
local   all             postgres                                peer

local   all             postgres                                trust
  1. 重启服务器
$ sudo service postgresql restart
Run Code Online (Sandbox Code Playgroud)
  1. 登录psql并设置密码

psql -U postgres

$ psql -U postgres
db> ALTER USER postgres with password 'your-pass';
Run Code Online (Sandbox Code Playgroud)
  1. 最后,改变pg_hba.conf
local   all             postgres                                trust

local   all             postgres                                md5

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

验证方法细节:

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

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

md5 - 基于密码的身份验证

有关进一步参考,请点击此

  • 将方法改为"信任"对我有用.+1用于解释身份验证方法详细信息. (17认同)
  • 在OS X自制程序上,默认是信任,而在Ubuntu上,默认设置为"peer",这导致我的设置与我的同事之间的差异.我们将他改为MD5并没有帮助,所以"信任"是真正的答案(我们只做开发测试).应该得到更多的赞成. (3认同)
  • 你也可以从一开始就设置md5 (2认同)
  • 这种方式对我有用,首先使用方法 md5 不是。 (2认同)

Sty*_*ter 186

如果您通过localhost(127.0.0.1)连接,则不应遇到该特定问题.我不会吝啬pg_hba.conf但我会调整你的连接字符串:

psql -U someuser -h 127.0.0.1 database
Run Code Online (Sandbox Code Playgroud)

其中某个用户是您正在连接的用户,而数据库是您的用户有权连接的数据库.

这是我在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
Run Code Online (Sandbox Code Playgroud)

请享用!

  • 我认为这是最好的解决方案,因为它实际上解决了本地问题而没有搞乱而没有搞乱全局配置,正如其他答案所推荐的那样. (14认同)
  • 我必须在 config/database.yml 中将 `host: 127.0.0.1` 从默认更改为 localhost - 它位于同一台机器上,所以我不明白为什么 (3认同)
  • 与使用本地对等身份验证方法相比,这要优雅得多。 (2认同)
  • 这再次让我震惊,认为在本地主机上运行与告诉 psql 不同。真正的问题是,至少在 *nix 操作系统上,否则 psql 会尝试通过本地套接字进行连接,默认情况下仅允许用户 postgres 进行连接。 (2认同)

小智 36

这对我有用!!

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

  • 只要您当前登录的用户在 sudoers 文件中,这应该可以正常工作。 (4认同)

Rok*_*kas 17

最简单的解决方案,无需更改配置。(ubuntu) 更改用户,然后连接到数据库 cli。

sudo -i -u postgres

psql
Run Code Online (Sandbox Code Playgroud)

取自https://www.digitalocean.com/community/tutorials/how-to-install-and-use-postgresql-on-ubuntu-18-04


Pra*_*jan 17

当您不提供主机时,可能会出现此错误。下面的场景与此类似。

user@homepc:~$ psql -d test_db -U test_user
psql: 错误: 致命: 用户“test_user”的对等身份验证失败
user@homepc:~$ psql -h localhost -d test_db -U test_user
用户 test_user 的密码:

提供主机解决了我在 psql 命令行中的问题。尝试在 Rails 中为 postgress 提供连接配置中的主机。


d.d*_*lov 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';


Tai*_*aiz 15

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

就我而言:

$>  sudo nano /etc/postgresql/9.3/main/pg_hba.conf
Run Code Online (Sandbox Code Playgroud)
  1. md5替换peer

所以这将改为:

数据库管理登录由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
Run Code Online (Sandbox Code Playgroud)

这个:

数据库管理登录由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
Run Code Online (Sandbox Code Playgroud)
  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.
Run Code Online (Sandbox Code Playgroud)

注意:如果您尚未创建postgres用户.创建它,现在您可以使用该用户凭据访问postgres服务器.

提示:如果在postgres重新启动后它不起作用,则关闭终端并再次打开.


Gih*_*age 11

sudo psql --host=localhost --dbname=database-name --username=postgres
Run Code Online (Sandbox Code Playgroud)

这解决了我的问题

  • 我没想到会这么简单,但这在debian 9下对我有用 (3认同)

nir*_*ack 10

我有同样的问题.

来自depa的解决方案绝对正确.

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

检查文件:

$ ls /etc/postgresql/9.1/main/pg_hba.conf -l
Run Code Online (Sandbox Code Playgroud)

应该将此文件的权限授予您已注册psql的用户.

进一步.如果你现在好,..

根据@depa的说明更新.

$ sudo nano /etc/postgresql/9.1/main/pg_hba.conf
Run Code Online (Sandbox Code Playgroud)

然后进行更改.


Åsm*_*und 7

如果要保留默认配置但希望对一个特定用户/数据库连接使用套接字连接进行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
Run Code Online (Sandbox Code Playgroud)


小智 6

我正在克隆服务器上移动数据目录,并且以postgres身份登录时遇到麻烦.重置像这样的postgres密码对我有用.

__CODE__


小智 6

在我发现我需要在制作后重新启动postgres服务器之后,上面的编辑对我有用.对于ubuntu:

sudo /etc/init.d/postgresql restart
Run Code Online (Sandbox Code Playgroud)


小智 6

用于host=localhost连接.

PGconn *conn = PQconnectdb(
    "host=localhost user=postgres dbname=postgres password=123"
);
Run Code Online (Sandbox Code Playgroud)


Sup*_*ige 6

在pg_hba.conf中更改METHOD peer信任(/etc/postgresql/9.1/main/pg_hba.conf |第85行)解决了这个问题.添加md5要求输入密码,因此如果需要避免使用密码,请使用trust而不是md5.


小智 5

下面的命令对我有用:

psql -d myDb -U username -W
Run Code Online (Sandbox Code Playgroud)

  • 小心elaborat该命令的作用是什么? (2认同)

小智 5

您只需将 METHOD 设置为信任。

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

并重新加载 postgres 服务器。

# service postgresql-9.5 reload
Run Code Online (Sandbox Code Playgroud)

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


tay*_*lıç 5

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 在哪里,或者询问系统管理员它在哪里。您甚至不能依赖于询问 datadir 在哪里并解析 postgresql.conf,因为启动 Pg 时 init 脚本可能会传递类似 -c hba_file=/some/other/path 的参数。

你想要做的是询问 PostgreSQL:

SHOW hba_file;
Run Code Online (Sandbox Code Playgroud)

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

psql -t -P format=unaligned -c 'show hba_file';
Run Code Online (Sandbox Code Playgroud)

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

是的,这有点像先有鸡还是先有蛋的问题,因为如果用户无法连接(例如,在编辑 pg_hba.conf 搞砸之后),您将无法找到 pg_hba.conf 来修复它。

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

ps aux  | grep 'postgres *-D'
Run Code Online (Sandbox Code Playgroud)

因为 pg_hba.conf 将位于数据目录中(除非您使用 Debian/Ubuntu 或某些衍生版本并使用它们的软件包)。

如果您专门针对从 Debian/Ubuntu 软件包安装了 PostgreSQL 的 Ubuntu 系统,那么事情会变得更容易一些。你不必处理从源代码手工编译的 Pg,有人在他们的主目录中 initdb'd 了一个数据目录,或者在 /opt 中安装 EnterpriseDB Pg 等。你可以询问 pg_wrapper,Debian/Ubuntu 多版本-version 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 参数是否与您正在编辑的位置匹配,等等. https://askubuntu.com/questions/256534/how-do-i-find-the-path-to-pg-hba-conf-from-the-shell/256711


Sar*_*hna 5

请按照以下步骤

1)。首先,导航到 /etc/postgresql/{your pg version}/main 目录。

我的版本是 10 然后:

cd /etc/postgresql/10/main
Run Code Online (Sandbox Code Playgroud)

2)。这里驻留的 pg_hba.conf 文件需要在这里做一些更改,您可能需要 sudo 访问权限。

sudo nano pg_hba.conf
Run Code Online (Sandbox Code Playgroud)

3)。向下滚动文件,直到找到这个 –

# Database administrative login by Unix domain socket
local   all             postgres                                peer
Run Code Online (Sandbox Code Playgroud)

4)。这里把peer改成md5如下。

# Database administrative login by Unix domain socket
local   all             all                                md5
Run Code Online (Sandbox Code Playgroud)
  • peer 意味着它将信任 UNIX 用户的真实性,因此不会

  • 提示输入密码。md5 意味着它总是要求输入密码,并在用 MD5 散列后验证它。

5).现在保存文件并重新启动Postgres服务器。

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

现在应该没问题了。


alr*_*ein 5

大多数解决方案都建议编辑pg_hba.conf.

对于不想编辑配置文件的你,基本上只需要登录postgres用户即可。如果您正在使用/在 Linux 服务器中,请使用此命令

sudo -i -u postgres
Run Code Online (Sandbox Code Playgroud)

它将创建用户postgres,然后登录。现在再次尝试您的 psql 命令。

您还可以postgres使用以下命令为用户添加密码:(您应该是 root 用户)

passwd postgres
Run Code Online (Sandbox Code Playgroud)

这是有效的,因为根据这个PostgreSQL 的文档

对等认证

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