PG :: ConnectionBad:fe_sendauth:没有提供密码

时间:2014-04-29 21:35:37

标签: ruby-on-rails postgresql authentication

当我尝试在本地postgres数据库上运行“rake test”时,会抛出上述异常。

这是我的pg_hba.conf文件:     #Unix域名套接字的数据库管理登录     本地所有postgres同行

# 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

我还缺少什么?

7 个答案:

答案 0 :(得分:27)

localhost作为主机引用TCP连接,这意味着每个md5的身份验证方法为pg_hba.conf(需要密码):

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

对于要采用的peer方法,您需要通过Unix域套接字连接,并且由于您似乎使用类似debian的操作系统,这意味着将/var/run/postgresql放入{ {1}}字段,或者根本没有(除非环境变量另有说明,否则它是默认值)。

编辑:如果使用数据库URI(自Rails-4.1以来一直支持,如中所述) http://weblog.rubyonrails.org/2014/4/8/Rails-4-1/),语法可以是:

  • 对于localhost:
    host

  • 用于默认的Unix套接字域(主机字段留空):
    test: "postgresql://localhost/myapp_test"

答案 1 :(得分:16)

更改下面的代码,它将起作用

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哈希密码   认证。

参考更多here

答案 2 :(得分:7)

如果您的hb_conf已被修改为强制密码,请确保您的rails app的数据库配置在开发和测试环境中都包含密码。

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'] %>

当我无法为测试数据库提供密码时,我收到了此错误。

答案 3 :(得分:0)

我也遇到了这个问题。 我检查了我的数据库配置/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'] %>

答案 4 :(得分:0)

我使用Postgres App。确实很棒,因为您不必在数据库的默认部分提供用户名和密码。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正常工作。

解决方案:使用documentation进行以下操作:

1)卸载应用

2)使用此answer(表示使用sudo pkill -u postgres

)停止postgres进程

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

现在一切正常,祝您有美好的一天!

注意:这样做还解决了 Postgres.app端口5432使用中的问题

答案 5 :(得分:0)

我遇到了一个问题,由同事解决了: 您需要在postgres中设置本地用户和密码

createuser --interactive --pwprompt

它将询问您角色的名称(用户)和您想要的密码。

然后,您必须将此用户名和密码添加到database.yml文件中

答案 6 :(得分:0)

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

# 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