我得到了错误:
FATAL: Peer authentication failed for user "postgres"
当我尝试让postgres与Rails一起工作时。
这是pg_hba.conf,我的数据库。Yml,以及完整跟踪的转储。
我在pg_hba中将身份验证更改为md5,并尝试了不同的方法,但似乎都不起作用。
我还尝试按照Rails 3.2创建一个新用户和数据库,FATAL: Peer authentication failed for user (PG::Error)
但是它们不会在pgadmin上显示,甚至当我运行sudo -u postgres psql -l时也不会显示。
知道我哪里错了吗?
请按照以下步骤操作
1).首先,进入/etc/postgresql/{你的pg版本}/main目录。
我的版本是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).此处修改peer为md5,如下所示。
# Database administrative login by Unix domain socket
local all all md5
peer表示它信任UNIX用户的真实性,因此不信任
提示输入密码。Md5意味着它总是会要求输入密码,
并在MD5散列后进行验证。
5).现在保存文件并重新启动Postgres服务器。
sudo service postgresql restart
现在应该没问题了。
问题仍然是你的pg_hba.conf文件*。
这条线:
local all postgres peer
应该是:
local all postgres md5
修改此文件后,不要忘记重新启动PostgreSQL服务器。如果你在Linux上,那将是sudo systemctl restart postgresql(在旧系统上:sudo service postgresql restart)。
定位hba.conf
注意,这个文件的位置不是很一致。
您可以使用locate pg_hba.conf或询问PostgreSQL SHOW hba_file;来发现文件位置。
通常位于/etc/postgresql/[version]/main/pg_hba.conf和/var/lib/pgsql/data/pg_hba.conf。
下面是根据官方PostgreSQL文档中的认证方法对peer和md5选项的简要描述。
对等的身份验证
对等体认证的工作原理是获取客户端的认证信息
来自内核的操作系统用户名,并使用它作为允许的
数据库用户名(可选用户名映射)。这个方法是
仅支持本地连接。
密码身份验证
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有关的答案确实适用,并且是100%正确的。但是,请确保您正在修改正确的配置文件。
正如其他人所提到的,配置文件的位置可以在主配置文件中使用各种设置来覆盖,也可以在命令行上使用-D选项提供主配置文件的路径。
您可以在psql会话中使用以下命令来显示正在读取配置文件的位置(假设您可以启动psql)。这只是一个故障排除步骤,可以帮助一些人:
select * from pg_settings where setting~'pgsql';
您还应该确保postgres用户的主目录位于您预期的位置。我这样说是因为很容易忽略这一点,因为您的提示符将显示'~'而不是您的主目录的实际路径,这使得它不那么明显。许多安装默认postgres用户主目录为/var/lib/pgsql.
如果它没有被设置为它应该是什么,停止postgresql服务,并在以root身份登录时使用以下命令。同时确保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路径设置都应该是正确的!