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

Getting error: Peer authentication failed for user “postgres”, when trying to get pgsql working with rails

我得到错误:

1
FATAL: Peer authentication failed FOR USER"postgres"

当我试图让Postgres使用Rails时。

这是我的pg_hba.conf,我的database.yml,和一堆完整的痕迹。

我在pg_hba中将身份验证改为md5,并尝试了不同的方法,但似乎没有一个有效。

我还尝试根据Rails 3.2创建一个新的用户和数据库,致命的是:用户的对等身份验证失败(pg::error)

但它们不会出现在pgadmin上,甚至在我运行sudo -u postgres psql -l时也不会出现。

知道我哪里出错了吗?


问题仍然是您的pg_hba.conf文件(/etc/postgresql/9.1/main/pg_hba.conf*)。这条线:

1
LOCAL   ALL             postgres                                peer

应该是

1
LOCAL   ALL             postgres                                md5

*如果找不到这个文件,运行locate pg_hba.conf应该显示文件在哪里。

更改此文件后,不要忘记重新启动PostgreSQL服务器。如果您使用的是Linux,那么应该是sudo service postgresql restart

这些是根据官方的PostgreSQL文档对两种认证方法的简要描述。

对等身份验证

The peer authentication method works by obtaining the client's
operating system user name from the kernel and using it as the allowed
database user name (with optional user name mapping). This method is
only supported on local connections.

密码验证

The password-based authentication methods are md5 and password. These
methods operate similarly except for the way that the password is sent
across the connection, namely MD5-hashed and clear-text respectively.

If you are at all concerned about password"sniffing" attacks then md5
is preferred. Plain password should always be avoided if possible.
However, md5 cannot be used with the db_user_namespace feature. If the
connection is protected by SSL encryption then password can be used
safely (though SSL certificate authentication might be a better choice
if one is depending on using SSL).

pg_hba.conf的样本位置

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


安装了PostgreSQL之后,我执行了以下步骤。

  • 为Ubuntu打开文件pg_hba.conf,它将在/etc/postgresql/9.x/main中,并更改此行:
  • 1
    LOCAL   ALL             postgres                                peer

    1
    LOCAL   ALL             postgres                                trust
  • 重新启动服务器
  • 1
    sudo service postgresql restart
  • 登录psql并设置密码
  • psql -U postgres

    1
    ALTER USER postgres WITH password 'your-pass';
  • 最后将pg_hba.conf
  • 1
    LOCAL   ALL             postgres                                trust

    1
    LOCAL   ALL             postgres                                md5

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

    身份验证方法详细信息:

    trust - anyone who can connect to the server is authorized to access the database

    peer - use client's operating system user name as database user name to access it.

    md5 - password-base authentication

    如需进一步参考,请查看此处


    如果通过本地主机(127.0.0.1)连接,则不应遇到该特定问题。我不会太在意pg_hba.conf,但我会调整您的连接字符串:

    1
    psql -U someuser -h 127.0.0.1 DATABASE

    其中someuser是您作为连接的用户,database是您的用户有权连接的数据库。

    下面是我在Debian上设置Postgres的步骤:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    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

    享受!


    这对我有用!!

    1
    sudo -u postgres psql


  • 转到/etc/postgresql/9.x/main/并打开pg_hba.conf文件
  • 在我看来:

    1
    $>  sudo nano /etc/postgresql/9.3/main/pg_hba.conf
  • 用MD5替换对等机
  • 因此,这将更改为:

    通过Unix域套接字进行数据库管理登录本地所有Postgres对等

    1
    2
    3
    4
    5
    6
    # 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域套接字进行数据库管理登录本地所有Postgres MD5

    1
    2
    3
    4
    5
    6
    # 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
  • 然后重新启动PG服务器:

    $>sudo服务postgresql重启

  • 下面是用于连接Postgres的方法列表:

    1
    2
    3
    4
    # 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.

    注意:如果您还没有创建Postgres用户。创建它,现在您可以使用该用户凭证访问Postgres服务器。

    提示:如果Postgres重启后不工作,则关闭终端,重新打开。


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


    我也有同样的问题。

    DEPA的解决方案是绝对正确的。

    只需确保有一个用户配置为使用PostgreSQL。

    检查文件:

    1
    $ ls /etc/postgresql/9.1/main/pg_hba.conf -l

    此文件的权限应授予您向其注册PSQL的用户。

    进一步。如果你现在还不错……

    按照@depa的指示进行更新。

    1
    $ sudo nano /etc/postgresql/9.1/main/pg_hba.conf

    然后做出改变。


    如果要保留默认配置,但要对一个特定用户/db连接使用套接字连接进行MD5身份验证,请在"本地全部/全部"行之前添加一个"本地"行:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    # 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


    我在克隆服务器上移动数据目录,无法以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=#


    在我发现需要重新启动Postgres服务器之后,上面的编辑对我很有效。Ubuntu:

    1
    sudo /etc/init.d/postgresql restart

    连接时使用host=localhost

    1
    2
    3
    PGconn *conn = PQconnectdb(
       "host=localhost user=postgres dbname=postgres password=123"
    );


    将方法peer改为pg_hba.conf中的trust(/etc/postgresql/9.1/main/pg_hba.conf_line 85)解决了这个问题。添加MD5需要密码,因此如果需要避免使用密码,请使用信任而不是MD5。


    以下命令适用于我:

    1
    psql -d myDb -U username -W


    许多其他答案与各种配置文件中的设置有关,与pg_hba.conf相关的答案确实适用,并且100%正确。但是,请确保正在修改正确的配置文件。

    正如其他人提到的,配置文件的位置可以被主配置文件中的各种设置覆盖,也可以使用-D选项在命令行上提供主配置文件的路径。

    在psql会话中,可以使用以下命令来显示正在读取配置文件的位置(假设可以启动psql)。这只是一个故障排除步骤,可以帮助一些人:

    1
    SELECT * FROM pg_settings WHERE setting~'pgsql';

    您还应该确保Postgres用户的主目录在您期望的位置。我这样说是因为很容易忽略这一点,因为您的提示将显示"~",而不是主目录的实际路径,这使得它不那么明显。许多安装将postgres用户主目录默认为/var/lib/pgsql

    如果没有设置为应该的值,请停止PostgreSQL服务,并在以根用户身份登录时使用以下命令。还要确保Postgres用户没有登录到其他会话:

    1
    usermod -d /path/pgsql postgres

    最后,通过键入echo $PGDATA确保正确设置pgdata变量,该变量应输出类似以下内容的内容:

    1
    /path/pgsql/DATA

    如果它没有设置,或者显示的内容与您期望的不同,请检查您的启动文件或rc文件,如.profile或.bash.rc-这将根据您的操作系统和shell的不同而有很大的不同。确定了机器的正确启动脚本后,可以插入以下内容:

    1
    export PGDATA=/path/pgsql/DATA

    对于我的系统,我把它放在/etc/profile.d/profile.local.sh中,这样所有用户都可以访问它。

    现在您应该能够像往常一样初始化数据库,并且您的所有psql路径设置都应该是正确的!


    您只需将方法设置为信任即可。

    1
    2
    #TYPE  DATABASE        USER            ADDRESS                 METHOD
    LOCAL    ALL             ALL                                     trust

    重新加载Postgres服务器。

    1
    # service postgresql-9.5 reload

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


    我的问题是我没有输入任何服务器。我认为这是一个默认值,因为占位符,但当我键入localhost时,它确实起作用。


    如果您试图在Cloud9中定位此文件,可以这样做

    1
    sudo vim /var/lib/pgsql9/DATA/pg_hba.conf

    I编辑/插入,按ESC3次,输入:wq保存文件退出


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

    这解决了我的问题


    如果您在Rails中遇到这个问题,并且您知道已经用密码和正确的权限创建了这个用户名,那么您只需要在database.yml文件的末尾放以下内容。

    1
    host: localhost

    整体文件如下

    1
    2
    3
    4
    5
    6
    7
    8
    development:
      adapter: postgresql
      encoding: unicode
      DATABASE: myapp_development
      pool: 5
      username: root
      password: admin
      host: localhost

    你根本不需要接触你的pg_hba.conf文件。快乐编码