psql:FATAL:用户“dev”的对等身份validation失败
当我创build一个新的用户,但它不能login数据库。
我这样做:
postgres@Aspire:/home/XXX$ createuser dev 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) y
然后创build一个数据库:
postgres@Aspire:/home/XXX$ createdb -O dev test_development
之后,我尝试psql -U dev -W test_development
login,但是得到错误:
psql: FATAL: Peer authentication failed for user "dev"
我试图解决问题,但失败了。
尝试:
psql user_name -h 127.0.0.1 -d db_name
哪里
-
-h
是本地服务器的主机名/ IP,因此避免了Unix域套接字 -
-d
是连接到的数据库名称
然后通过Postgresql而不是Unix域套接字连接评估为“networking”连接,因此不会像在pg_hba.conf
看到的那样将其评估为“本地”连接:
local all all peer
您的连接失败,因为默认情况下, psql
通过使用peer
身份validation的UNIX套接字进行连接,这要求当前的UNIX用户具有与psql
相同的用户名。 因此,您将不得不创buildUNIX用户dev
,然后以dev
身份login或使用sudo -u dev psql test_development
访问数据库(并且psql
不应要求input密码)。
如果你不能或不想创buildUNIX用户,就像你只是想连接到你的数据库进行即席查询,用psql --host=localhost --dbname=test_development --username=dev
强制一个套接字连接psql --host=localhost --dbname=test_development --username=dev
(正如@meyerson的回答所指出的那样)将解决你眼前的问题。
但是,如果您打算通过Unix套接字而非对等方法强制进行密码validation,请尝试更改以下pg_hba.conf
*行:
从
# TYPE DATABASE USER ADDRESS METHOD local all all peer
至
# TYPE DATABASE USER ADDRESS METHOD local all all md5
-
peer
意味着它将信任UNIX用户的身份(真实性)。 所以不要求密码。 -
md5
意味着它总是要求input密码,并在MD5
散列之后进行validation。
当然,您也可以为特定数据库或用户创build更具体的规则,其中一些用户具有peer
和其他需要密码的用户。
如果PostgreSQL正在运行,更改pg_hba.conf
后,需要重新读取configuration( pg_ctl reload
)或重新启动( sudo service postgresql restart
)来重新读取configuration。
* pg_hba.conf
文件很可能位于/etc/postgresql/9.x/main/pg_hba.conf
编辑: @Chloe,@JavierEH,@Jonas Eicher,@fccoelho,@Joanis,@Uphill_What评论纳入回答。
对等身份validation意味着postgres向操作系统询问您的login名并将其用于身份validation。 要在postgres上使用同行authentication作为用户“dev”login,您也必须是操作系统上的用户“dev”。
您可以在Postgresql文档中find身份validation方法的详细信息。
提示:如果再没有validation方法工作,请断开服务器与networking的连接,对“localhost”使用方法“trust”(并在方法“trust”启用时再次检查您的服务器是否无法通过networking访问)。
当你指定:
psql -U user
它通过UNIX套接字连接,默认情况下它使用peer
身份validation,除非在pg_hba.conf
指定,否则。
你可以指定:
host database user 127.0.0.1/32 md5 host database user ::1/128 md5
在指定的database
和user
环回接口(包括IPv4和IPv6)上获得TCP / IP连接。
更改后,你必须重新启动postgres或重新加载它的configuration。 重新启动应该在现代RHEL / Debian的发行版中工作:
service postgresql restart
重新加载应按以下方式进行:
pg_ctl reload
但命令可能会有所不同,具体取决于PATHconfiguration – 您可能必须指定绝对path,这可能是不同的,这取决于postgres的安装方式。
那么你可以使用:
psql -h localhost -U user -d database
通过TCP / IP使用该user
login到指定的database
。 md5
代表encryption的密码,而您也可以在授权过程中为纯文本密码指定password
。 只要数据库服务器只能在本地访问,没有networking访问,这两个选项就不应该是一件很重要的事情。
重要说明: pg_hba.conf
定义顺序非常重要 – 规则是从上到下读取的,就像iptables一样,所以您可能希望在规则上面添加build议的规则:
host all all 127.0.0.1/32 ident
虽然@ flaviodesousa的答案是可行的,但是它也强制所有用户(其他人)input密码。
某些时候,为其他人保持对等身份validation是有道理的,但对于服务用户来说是个例外。 在这种情况下,你会想要添加一行到pg_hba.conf,如下所示:
local all some_batch_user md5
我build议你在注释的标题行下面添加这行:
# TYPE DATABASE USER ADDRESS METHOD local all some_batch_user md5
您将需要使用重新启动PostgreSQL
sudo service postgresql restart
如果你使用9.3,你的pg_hba.conf很可能是:
/etc/postgresql/9.3/main/pg_hba.conf
当我碰到它的时候,这对我有用:
sudo -u username psql
最简单的解决scheme:
CREATE USER dev WITH PASSWORD 'dev'; CREATE DATABASE test_development; GRANT ALL PRIVILEGES ON DATABASE test_development to dev; ALTER ROLE dev CREATEROLE CREATEDB;
在我的情况下,我正在使用不同的端口。 默认是5432.我正在使用5433.这对我工作:
$ psql -f update_table.sql -d db_name -U db_user_name -h 127.0.0.1 -p 5433