PG::ConnectionBad:fe_sendauth:未提供密码

55
当我在本地的PostgreSQL数据库上尝试运行“rake test”时,它抛出了上述异常。
这是我的pg_hba.conf文件: #由Unix域套接字进行数据库管理登录 local all postgres peer
# TYPE  DATABASE        USER            ADDRESS                 METHOD

# "local" is for Unix domain socket connections only
local   all             username                                  peer
local   myapp_dev   myapp                               md5
local   myapp_test  myapp                               md5
local   myapp_prod  myapp                               md5
#local   all             all                                     peer
# IPv4 local connections:
host    all             all             127.0.0.1/32            md5
# IPv6 local connections:
host    all             all             ::1/128                 md5
# Allow replication connections from localhost, by a user with the
# replication privilege.
#local   replication     postgres                                peer
#host    replication     postgres        127.0.0.1/32            md5
#host    replication     postgres        ::1/128                 md5

这里是我的database.yml文件中相关的部分

test:

adapter: postgresql
database: myapp_test
pool: 5
timeout: 5000
host: localhost
username: username
password:

在实际的database.yml文件中,'username'被替换为我实际登录的用户名。由于认证方法被定义为'peer',因此不需要输入密码。

我还特别注意重新启动了Postgres

sudo -u postgres pg_ctlcluster 9.3 main restart

我还错过了什么吗?

8个回答

33

将代码更改如下,它就会起作用。

pg_hba.conf:
# IPv4 local connections:
host    all             all             127.0.0.1/32            trust
# IPv6 local connections:
host    all             all             ::1/128                 trust

以下是解释:

信任

无条件允许连接。该方法允许任何能够连接到PostgreSQL数据库服务器的人以任何PostgreSQL用户的身份登录,无需密码或任何其他验证。

MD5

要求客户端提供双重MD5哈希密码进行身份验证。

了解更多请参考此处


6
它对我确实起作用了。但是有人能否详细说明一下它是否相当安全?这是否意味着所有连接从现在开始都不需要密码了? - mohnstrudel
这意味着任何本地用户的所有连接都是允许的,没有密码或任何其他身份验证方式。 "当指定了信任身份验证时,PostgreSQL假定可以连接到服务器的任何人都已被授权使用他们指定的任何数据库用户名(甚至是超级用户名称)来访问数据库。" 我宁愿选择peer 方法:"...通过从内核获取客户端操作系统用户名并将其用作允许的数据库用户名来工作..." - x-yuri

32

localhost 是指TCP连接的主机,这意味着pg_hba.conf中要求使用 md5(需要密码)进行身份验证:

# IPv4 local connections:
host    all             all             127.0.0.1/32            md5
# IPv6 local connections:
host    all             all             ::1/128                 md5

要使用 peer 方法,则需要通过Unix域套接字进行连接。由于您似乎正在使用类似Debian的操作系统,这意味着在host字段中放置/var/run/postgresql,或者什么也不放(除非环境变量另有规定),就可以使用该方法。

编辑:如果使用数据库URI(自Rails-4.1起支持,如http://weblog.rubyonrails.org/2014/4/8/Rails-4-1/所宣布),则语法可能是:

  • 对于localhost:
    test: "postgresql://localhost/myapp_test"

  • 对于默认的Unix套接字域(留空host字段):
    test: "postgresql:///myapp_test"


4
请注意,"host field" 指的是 database.yml 文件中的 host: localhost 字段。我将其改为 host: /var/run/postgresql 后也可以正常工作。谢谢回答!(在 Debian 7.8 下) - pimgeek
当你说“什么都没有”的时候,是指 host: "" 还是完全删除 host 键? - Dennis
@Dennis:好问题,我是从postgresql的角度回答的,但在database.yml中的语法以及空字段是否应该提交的方面,我没有答案。如果您或其他人有兴趣测试它,请随意编辑答案并分享结果。 - Daniel Vérité
@DanielVérité 我移除了 host 并没有发现问题,而 @Isiden 使用 host: "" 成功,所以我猜两者都可以。我没有深入研究它,所以我觉得更安全的做法是留下这个评论而不是编辑答案。 - Dennis
13
pg_hba.conf 文件位于 Ubuntu 上的 /etc/postgresql/9.3/main/pg_hba.conf - Bruno Peres
当使用 postgres:// 样式的 URI 时,将 postgres://localhost/database 替换为 postgres:///database 即可解决问题。 - mkataja

11

如果您的hb_conf已经被修改以强制要求密码,则请确保Rails应用程序的数据库配置在开发环境和测试环境中都包含密码。

default: &default
  adapter: postgresql
  encoding: unicode
  pool: 5
  host: localhost
  username: your_user
  password: your_password

development:
  <<: *default
  database: your_db_development

test:
  <<: *default
  database: your_db_test

production:
  url: <%= ENV['DATABASE_URL'] %>

当我没有提供测试数据库的密码时,出现了这个错误。


0

在你的项目中初始化点环境

   # dot gem
 gem 'dotenv-rails', groups: [:development, :test]

比起 bundle install

然后在您的项目中创建一个 .env 文件并添加以下行

POSTGRES_HOST=localhost
POSTGRES_USER= user_name
POSTGRES_PASSWORD= your_password
RAILS_MAX_THREADS=5

0

/etc/postgresql/<postgres-version>/main/pg_hba.conf文件中的peer方法重命名为trust

# Database administrative login by Unix domain socket
local   all             postgres                                trust

# TYPE  DATABASE        USER            ADDRESS                 METHOD

# "local" is for Unix domain socket connections only
local   all             all                                     trust
# IPv4 local connections:
host    all             all             127.0.0.1/32            trust
# IPv6 local connections:
host    all             all             ::1/128                 trust
# Allow replication connections from localhost, by a user with the
# replication privilege.
local   replication     all                                     trust
host    replication     all             127.0.0.1/32            trust
host    replication     all             ::1/128                 trust

0

我使用Postgres App。这真的很棒,因为你不必在database.yml的默认部分提供用户名和密码。

database.yml

default: &default
  adapter: postgresql
  encoding: unicode
  pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>

development:
  <<: *default
  database: my-app_development

test:
  <<: *default
  database: my-app_test

production:
  <<: *default
  database: my-app_production
  username: my-app
  password: <%= ENV['MY-APP_DATABASE_PASSWORD'] %>

我的问题:我更改了路径,但无法让Postgres工作。

解决方案:使用文档

1)卸载应用程序

2)使用此答案停止postgres进程,该答案建议使用sudo pkill -u postgres

3)重新安装并启动应用程序

现在一切都应该正常工作了,祝您愉快!

注意:这样做也可以解决问题Postgres.app端口5432正在使用中


0
我遇到了这个问题,后来同事帮我解决了: 你需要在Postgres中设置本地用户和密码。
createuser --interactive --pwprompt

它会要求你输入角色(用户)的名称和想要设置的密码。

然后,你需要将这个用户名和密码添加到你的database.yml文件中。


-1

我也遇到了这个问题。我检查了我的数据库配置文件:/var/www/myproject/shared/config/database.yml

production: 
adapter: postgresql 
pool: 5 
timeout: 5000 
encoding: utf8 
host: localhost 
database: myproject
username: myname 
password: <%= ENV['name_DATABASE_PASSWORD'] %>

我发现最后一段是错误的,正确的代码应该是

password: <%= ENV['myproject_DATABASE_PASSWORD'] %>

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