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

时间:2013-09-06 18:15:07

标签: ruby-on-rails postgresql

我收到了错误:

FATAL: Peer authentication failed for user "postgres"

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

这是我的pg_hba.conf,我的database.ymldump of the full trace

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

我还尝试按照Rails 3.2, FATAL: Peer authentication failed for user (PG::Error)

创建新用户和数据库

但是他们没有出现在pgadmin上,甚至没有出现在sudo -u postgres psql -l上。

知道我哪里出错了?

23 个答案:

答案 0 :(得分:854)

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

local   all             postgres                                peer

应该是

local   all             postgres                                md5

*如果找不到此文件,则运行locate pg_hba.conf会显示该文件的位置。

更改此文件后,请不要忘记重新启动PostgreSQL服务器。如果你在Linux上,那将是sudo service postgresql restart

这些是根据official PostgreSQL docs on authentication methods对这两个选项的简要说明。

对等身份验证

  

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

密码验证

  

基于密码的身份验证方法是md5和密码。这些   除了密码发送的方式之外,方法的操作类似   跨越连接,分别是MD5-hashed和clear-text。

     

如果你在关注密码“嗅探”攻击那么md5   是优选的。如果可能,应始终避免使用普通密码。   但是,md5不能与db_user_namespace功能一起使用。如果   连接受SSL加密保护,然后可以使用密码   安全(尽管SSL证书认证可能是更好的选择   如果一个人依赖于使用SSL)。

pg_hba.conf

的示例位置
  

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

答案 1 :(得分:285)

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

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

    local   all             postgres                                trust
    1. 重新启动服务器
    2. sudo service postgresql restart
      
      1. 登录psql并设置密码
      2.   

        psql -U postgres

        ALTER USER postgres with password 'your-pass';
        
        1. 最后更改pg_hba.conf
        2. local   all             postgres                                trust

          local   all             postgres                                md5

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

          身份验证方法详情:

            

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

               

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

               

          md5 - 基于密码的身份验证

          供进一步参考check here

答案 2 :(得分:163)

如果您通过localhost(127.0.0.1)连接,则不应该遇到该特定问题。我不会用pg_hba.conf来解决问题,而是调整你的连接字符串:

psql -U someuser -h 127.0.0.1 database

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

以下是我在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

享受!

答案 3 :(得分:27)

这对我有用!!

sudo -u postgres psql

答案 4 :(得分:14)

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

答案 5 :(得分:12)

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

sudo -i -u postgres

psql

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

答案 6 :(得分:10)

我遇到了同样的问题。

depa的解决方案绝对正确。

请确保您已将用户配置为使用PostgreSQL。

检查文件:

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

此文件的权限应授予您已使用。

注册psql的用户

此外。如果你到现在为止都很好..

根据@ depa的说明进行更新。

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

然后进行更改。

答案 7 :(得分: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

答案 8 :(得分:6)

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

答案 9 :(得分:6)

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

sudo /etc/init.d/postgresql restart

答案 10 :(得分:6)

连接使用host=localhost

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

答案 11 :(得分:5)

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

答案 12 :(得分:4)

以下命令对我有用:

psql -d myDb -U username -W

答案 13 :(得分:4)

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

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

sudo -i -u postgres

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

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

passwd postgres

这是有效的,因为根据这个PostgreSQL's Documentation

对等身份验证

<块引用>

对等身份验证方法通过获取客户端的 内核中的操作系统用户名并将其用作允许的 数据库用户名(带有可选的用户名映射)。这种方法是 仅支持本地连接。

答案 14 :(得分:3)

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

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

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

select * from pg_settings where setting~'pgsql';  

您还应确保postgres用户的主目录符合您的预期目的。我这样说是因为很容易忽略这一点,因为你的提示会显示&#39; ~&#39;而不是你的主目录的实际路径,使它不那么明显。许多安装将postgres用户主目录默认为/var/lib/pgsql

如果未将其设置为预期,请以root身份登录时停止postgresql服务并使用以下命令。还要确保postgres用户没有登录到另一个会话:

usermod -d /path/pgsql postgres

最后输入echo $PGDATA确保您的PGDATA变量设置正确,输出类似于:

/path/pgsql/data

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

export PGDATA=/path/pgsql/data

对于我的系统,我将其放在/etc/profile.d/profile.local.sh中,以便所有用户都可以访问。

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

答案 15 :(得分:3)

您只需将METHOD设置为信任。

#TYPE  DATABASE        USER            ADDRESS                 METHOD
local    all             all                                     trust

重新加载postgres服务器。

# service postgresql-9.5 reload

pg_hba.conf中的更改不需要RESTART postgres服务器。只是RELOAD。

答案 16 :(得分:3)

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

这解决了我的问题

答案 17 :(得分:2)

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

答案 18 :(得分:2)

如果您尝试在Cloud 9中找到此文件,则可以执行

<android.support.design.widget.CoordinatorLayout 
    android:id="@+id/coordinatorLayout"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <android.support.design.widget.AppBarLayout
        android:id="@+id/appBar"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:fitsSystemWindows="true"
        android:theme="@style/AppTheme.AppBarOverlay"
        app:expanded="true">

        <android.support.design.widget.CollapsingToolbarLayout
            android:id="@+id/collapsingToolbarLayout"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            app:layout_scrollFlags="scroll|exitUntilCollapsed|enterAlways"
            app:statusBarScrim="?attr/colorPrimaryDark">

            <LinearLayout
                android:layout_width="match_parent"
                android:layout_height="?attr/actionBarSize"
                android:layout_marginTop="?attr/actionBarSize"
                android:background="@color/colorAccent"
                android:orientation="vertical"
                app:layout_collapseMode="parallax"
                app:layout_collapseParallaxMultiplier="0.0">

                <TextView
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:text="This is line #1 of the sliding layout..." />

                <TextView
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:text="This is line #2 of the sliding layout..." />
            </LinearLayout>

            <android.support.v7.widget.Toolbar
                android:id="@+id/toolbar"
                android:layout_width="match_parent"
                android:layout_height="?attr/actionBarSize"
                android:background="@color/colorPrimary"
                app:layout_collapseMode="pin" />

        </android.support.design.widget.CollapsingToolbarLayout>

    </android.support.design.widget.AppBarLayout>

    <android.support.v4.widget.NestedScrollView
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        app:layout_behavior="@string/appbar_scrolling_view_behavior"
        tools:context="example.com.myapp.ScrollingActivity"
        tools:showIn="@layout/activity_scrolling">

        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_margin="@dimen/text_margin"
            android:text="@string/large_text" />

    </android.support.v4.widget.NestedScrollView>

</android.support.design.widget.CoordinatorLayout>

sudo vim /var/lib/pgsql9/data/pg_hba.conf 进行编辑/插入,按I 3次,然后输入ESC将保存文件并退出

答案 19 :(得分:1)

如果您在使用rails时遇到此问题,并且您知道已经使用密码创建了该用户名以及正确的权限,那么您只需要将以下内容放在database.yml文件的末尾。

host: localhost

整体文件如下所示

development:
  adapter: postgresql
  encoding: unicode
  database: myapp_development
  pool: 5
  username: root
  password: admin
  host: localhost

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

答案 20 :(得分:0)

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所在的位置,或询问sysadmin位置。您甚至不必依靠询问datadir的位置并解析postgresql.conf,因为启动Pg时初始化脚本可能会传递-c hba_file = / some / other / path之类的参数。

您要做的是询问PostgreSQL:

SHOW hba_file;

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

psql -t -P format=unaligned -c 'show hba_file';

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

是的,这有点像个鸡和蛋的问题,因为如果用户无法连接(例如,在修改pg_hba.conf进行编辑之后),则无法找到pg_hba.conf进行修复

另一种选择是查看ps命令的输出,并查看其中是否可以看到postmaster数据目录参数-D

ps aux  | grep 'postgres *-D'

因为pg_hba.conf将位于数据目录中(除非您使用的是Debian / Ubuntu或某些衍生产品,并使用其软件包)。

如果您要专门针对从Debian / Ubuntu软件包安装了PostgreSQL的Ubuntu系统,它会变得容易一些。您不必处理手工从源代码编译的Pg,该Pg是某人的initdb在其主目录中为其指定的datadir,也无需处理在/ opt中安装的EnterpriseDB Pg等。您可以询问pg_wrapper,Debian / Ubuntu multi版本的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

答案 21 :(得分:0)

请按照以下步骤操作

1)。首先,导航到/ etc / postgresql / {您的pg版本} /主目录。

我的版本是10然后:

cd /etc/postgresql/10/main

2)。此处驻留pg_hba.conf文件,需要在此处进行一些更改 sudo访问。

sudo nano pg_hba.conf

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

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

4)。在此将对等方更改为md5,如下所示。

# Database administrative login by Unix domain socket
local   all             all                                md5
  • peer表示它将信任UNIX用户的真实性,因此不信任

  • 提示输入密码。 md5表示它将始终要求输入密码, 并在使用MD5进行哈希处理后对其进行验证。

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

sudo service postgresql restart

现在应该可以了。

答案 22 :(得分:0)

在 CentOS 7、PG 10 上,文件路径为

/var/lib/pgsql/10/data/pg_hba.conf