【问题标题】:PG::ConnectionBad: fe_sendauth: no password suppliedPG::ConnectionBad: fe_sendauth: 未提供密码
【发布时间】:2014-06-16 01:04:42
【问题描述】:

当我尝试在本地 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 中,“用户名”被替换为我登录时使用的实际用户名。由于身份验证方法被定义为“对等”,因此不需要密码。

我也注意重启 Postgres

sudo -u postgres pg_ctlcluster 9.3 main restart

我还缺少什么?

【问题讨论】:

    标签: ruby-on-rails postgresql authentication


    【解决方案1】:

    localhost 作为主机是指 TCP 连接,这意味着根据您的pg_hba.conf,身份验证方法是md5(需要密码):

    # IPv4 本地连接: 托管所有 127.0.0.1/32 md5 # IPv6 本地连接: 托管所有::1/128 md5

    要采用peer 方法,您需要通过Unix 域套接字进行连接,并且由于您似乎使用的是类似debian 的操作系统,这意味着将/var/run/postgresql 放在host 字段中,或者什么都没有(这是默认设置,除非环境变量另有说明)。

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

    • 对于本地主机:
      test: "postgresql://localhost/myapp_test"

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

    【讨论】:

    • 请注意,host field 指的是 database.yml 中的host: localhost,我使用了host: /var/run/postgresql,它也可以。谢谢回答! (在 Debian 7.8 下)
    • 当你说“什么都没有”时,你的意思是 host: "" 还是完全删除 host 键?
    • @Dennis:好问题,我是从 postgresql 的角度回答的,但就 database.yml 中的语法以及是否/如何提交空字段而言,我没有答案。如果您或其他人倾向于对其进行测试,请随时使用结果编辑答案。
    • @DanielVérité 我删除了host 并没有注意到问题,而@Isiden 在host: "" 上取得了成功,所以我的猜测都是可行的。我没有仔细研究它,所以我觉得留下这条评论而不是编辑答案更安全。
    • pg_hba.conf 文件位于 Ubuntu 上的 /etc/postgresql/9.3/main/pg_hba.conf
    【解决方案2】:

    如下修改代码即可

    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

    【讨论】:

    • 它实际上对我有用。但是有人可以详细说明它是否相当安全吗?这是否意味着,从现在开始所有连接都省略密码?
    • 这意味着来自任何本地用户的所有连接都是allowed,没有密码或任何其他类型的身份验证。 “当指定信任身份验证时,PostgreSQL 假定任何可以连接到服务器的人都有权使用他们指定的任何数据库用户名(甚至是超级用户名)访问数据库。”我宁愿选择peer 方法:“......通过从内核获取客户端的操作系统用户名并将其用作允许的数据库用户名......”
    【解决方案3】:

    如果您的 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'] %>
    

    当我未能为测试数据库提供密码时,我收到了这个错误。

    【讨论】:

      【解决方案4】:

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

      数据库.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 停止 postgres 进程,它表示使用 sudo pkill -u postgres

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

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

      注意:这样做也解决了Postgres.app port 5432 in use

      的问题

      【讨论】:

        【解决方案5】:

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

        【讨论】:

          【解决方案6】:

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

          createuser --interactive --pwprompt
          

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

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

          【讨论】:

            【解决方案7】:

            在/etc/postgresql/&lt;postgres-version&gt;/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
            

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2019-07-23
              • 2015-12-17
              • 2016-10-15
              • 2019-04-25
              • 1970-01-01
              相关资源
              最近更新 更多