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中将身份验证改为md5,并尝试了不同的方法,但似乎没有一个有效。
我还尝试根据Rails 3.2创建一个新的用户和数据库,致命的是:用户的对等身份验证失败(pg::error)
但它们不会出现在pgadmin上,甚至在我运行
知道我哪里出错了吗?
问题仍然是您的
1 | LOCAL ALL postgres peer |
应该是
1 | LOCAL ALL postgres md5 |
*如果找不到这个文件,运行
更改此文件后,不要忘记重新启动PostgreSQL服务器。如果您使用的是Linux,那么应该是
这些是根据官方的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).
/etc/postgresql/9.1/main/pg_hba.conf
安装了PostgreSQL之后,我执行了以下步骤。
1 | LOCAL ALL postgres peer |
到
1 | LOCAL ALL postgres trust |
1 sudo service postgresql restart
psql -U postgres
1 | ALTER USER postgres WITH password 'your-pass'; |
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 |
在我看来:
1 | $> sudo nano /etc/postgresql/9.3/main/pg_hba.conf |
因此,这将更改为:
通过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重启后不工作,则关闭终端,重新打开。
如果您有问题,您需要找到您的
然后更改配置文件:
PostgreSQL 9.3
PostgreSQL 9.4
下一步是:重新启动数据库实例:
如果有任何问题,需要再次设置密码:
我也有同样的问题。
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密码对我很有用。
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 |
连接时使用
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 |
许多其他答案与各种配置文件中的设置有关,与
正如其他人提到的,配置文件的位置可以被主配置文件中的各种设置覆盖,也可以使用
在psql会话中,可以使用以下命令来显示正在读取配置文件的位置(假设可以启动psql)。这只是一个故障排除步骤,可以帮助一些人:
1 | SELECT * FROM pg_settings WHERE setting~'pgsql'; |
您还应该确保Postgres用户的主目录在您期望的位置。我这样说是因为很容易忽略这一点,因为您的提示将显示"
如果没有设置为应该的值,请停止PostgreSQL服务,并在以根用户身份登录时使用以下命令。还要确保Postgres用户没有登录到其他会话:
1 | usermod -d /path/pgsql postgres |
最后,通过键入
1 | /path/pgsql/DATA |
如果它没有设置,或者显示的内容与您期望的不同,请检查您的启动文件或rc文件,如.profile或.bash.rc-这将根据您的操作系统和shell的不同而有很大的不同。确定了机器的正确启动脚本后,可以插入以下内容:
1 | export PGDATA=/path/pgsql/DATA |
对于我的系统,我把它放在
现在您应该能够像往常一样初始化数据库,并且您的所有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 |
按
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 |
你根本不需要接触你的