`
shao_lixin
  • 浏览: 52412 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

关于连接PostgreSQL时提示 FATAL: password authentication failed for user "连接用户名" 的解决方法

阅读更多
今天帮一个同学解决了一个FATAL: password authentication failed for user "连接用户名" 的错误问题,下面说说一下我遇过这个问题的以往排除方法

一、密码忘记了,输入不正确

[postgres @ pgsqldb-master bin]$ psql -h 127.0.0.1 -U postgres
Password for user postgres:
psql: FATAL: password authentication failed for user "postgres"

解决方法
1、编辑pg_hba.conf,将md5认证修改成trust认证,编辑后退出保存

[postgres @ pgsqldb-master bin]$ vi ../data/pg_hba.conf

2、执行pg_ctl reload加载生效
[postgres @ pgsqldb-master bin]$ export PGPORT=5432
[postgres @ pgsqldb-master bin]$ export PGDATE=postgres
[postgres @ pgsqldb-master bin]$ export PGDATA=/pgdata/avx/data
[postgres @ pgsqldb-master bin]$ export PGUSER=postgres
[postgres @ pgsqldb-master bin]$ export PATH=/pgdata/avx/bin:$PATH
[postgres @ pgsqldb-master bin]$ pg_ctl reload
server signaled

3、psql连接,用alter role修改密码
[postgres @ pgsqldb-master bin]$ psql
psql (9.2.3)
Type "help" for help.

postgres=# alter role postgres with password '123';
ALTER ROLE
postgres=#

4、退出psql
5、编辑pg_hba.conf,将turst认证修改成md5认证,编辑后退出保存
6、执行pg_ctl reload加载生效

二、密码过期了(今天解决在就是这个),下面来看一下实验

设置用户的密码有效期至2013-01-01

postgres=# alter role postbbs with password '123' valid until '2013-01-01';
ALTER ROLE
postgres=# \pset x on
Expanded display is on.
postgres=# SELECT * FROM pg_roles WHERE rolname='postbbs';
-[ RECORD 1 ]--+-----------------------
rolname | postbbs
rolsuper | f
rolinherit | t
rolcreaterole | f
rolcreatedb | f
rolcatupdate | f
rolcanlogin | t
rolreplication | f
rolconnlimit | -1
rolpassword | ********
rolvaliduntil | 2013-01-01 00:00:00+08
rolconfig |
oid | 16425

postgres=#

postgres=# \q
[postgres @ pgsqldb-master bin]$ psql -h 127.0.0.1 -U postbbs -d postgres
Password for user postbbs:输入密码123 虽然正确,但不能登录进去
psql: FATAL: password authentication failed for user "postbbs"
[postgres @ pgsqldb-master bin]$

我们现在再修改回来

[postgres @ pgsqldb-master bin]$ psql -h 127.0.0.1 -U postgres
Password for user postgres:
psql (9.2.3)
Type "help" for help.

postgres=# alter role postbbs with valid until 'infinity';
ALTER ROLE
postgres=# \pset x on
Expanded display is on.
postgres=# SELECT * FROM pg_roles WHERE rolname='postbbs';
-[ RECORD 1 ]--+---------
rolname | postbbs
rolsuper | f
rolinherit | t
rolcreaterole | f
rolcreatedb | f
rolcatupdate | f
rolcanlogin | t
rolreplication | f
rolconnlimit | -1
rolpassword | ********
rolvaliduntil | infinity
rolconfig |
oid | 16425

postgres=# \q
[postgres@pgsqldb-master bin]$ psql -h 127.0.0.1 -U postbbs -d postgres
Password for user postbbs:
psql (9.2.3)
Type "help" for help.

postgres=>
postgres=# SELECT rolvaliduntil FROM pg_roles WHERE rolname='postbbs';
rolvaliduntil
---------------
infinity
(1 row)

postgres=#


a、alter role postbbs with valid until 'infinity'; 密码永远有效
b、如果所有用户的密码全部过期,这里也需要将认证修改成trust再进入,再修改生效日期才行

另外我发现pgadmin角色管理有一个bug,当密码的有限期设置成空或者 infinity 时,在pgadmin角色管理里面会显示成 1970-1-1 ,如果这时我们用pgadmin角色管理窗口修改其它参数时,则rolvaliduntil 值会变成 1970-1-1,结果退出后就无法进行认证了,所以用pgadmin 角色管理窗口进行参数设置时一定要注意了,例如用窗口设置用户变成管理员,则语句会变成





ALTER ROLE postbbs
SUPERUSER
VALID UNTIL '1970-01-01 00:00:00';



三、采用密码文件认证,但里面的密码是错误的,则会出现如下的提示

[postgres @ pgsqldb-master bin]$ cat /home/postgres/.pgpass
127.0.0.1:5432:*:postgres:1234
[postgres @ pgsqldb-master bin]$ psql -h 127.0.0.1 -U postgres -d postgres
psql: FATAL: password authentication failed for user "postgres"
password retrieved from file "/home/postgres/.pgpass"

解决方法
1、修改.pgpass文件,将密码修改正确,注意,linux下.pgpass的访问权限要设置成 0600

2、如果用户无法修改密码文件,则连接时加-W,强制输入密码

[postgres@pgsqldb-master bin]$ psql -h 127.0.0.1 -U postgres -d postgres -W
Password for user postgres:
psql (9.2.3)
Type "help" for help.

postgres=#

四、低级错误,用户名不存在

[postgres @ pgsqldb-master bin]$ psql -h 127.0.0.1 -U posgres -d postgres -W
Password for user posgres:
psql: FATAL: password authentication failed for user "posgres"
[postgres@pgsqldb-master bin]$ psql -h 127.0.0.1 -U postGres -d postgres -W
Password for user postGres:
psql: FATAL: password authentication failed for user "postGres"

这样的大头虾错误不看清楚往往更难发现,注意用户名也是区分大小写的

五、修改了用户密码采用md5加密的用户名

[postgres@pgsqldb-master bin]$ psql -h 127.0.0.1 -U postgres -d postgres -W
Password for user postgres:
psql (9.2.3)
Type "help" for help.

postgres=# alter role postbbs with ENCRYPTED password '123';
ALTER ROLE
postgres=# alter role postgres with ENCRYPTED password '123';
ALTER ROLE
postgres=# SELECT rolname,rolpassword FROM pg_authid;
rolname | rolpassword
----------+-------------------------------------
postbbs | md5514d208ad0f8842c176b4836992f1cbb
postgres | md59df270eb52907fff723d9b8b7436113a
(2 rows)

密码一样都是 "123" 不同用户名,生成的md5编码也是不样的

postgres=# alter role postbbs rename to postbbs_1;
NOTICE: MD5 password cleared because of role rename
ALTER ROLE
postgres=# SELECT rolname,rolpassword FROM pg_authid;
rolname | rolpassword
-----------+-------------------------------------
postgres | md59df270eb52907fff723d9b8b7436113a
postbbs_1 |
(2 rows)

因为MD5加密的口令使用角色名字作为加密的盐粒,所以, 如果口令是MD5加密的,那么给一个用户改名会清空其口令

更详细的说明 http://www.postgresql.org/docs/9.2/static/sql-alterrole.html

postgres=# \c postgres postbbs_1
Password for user postbbs_1:
FATAL: password authentication failed for user "postbbs_1"
Previous connection kept

由于密码清空,所以也就无法认证

postgres=# alter role postbbs_1 with UNENCRYPTED password '123';
ALTER ROLE
postgres=# SELECT rolname,rolpassword FROM pg_authid;
rolname | rolpassword
-----------+-------------------------------------
postgres | md59df270eb52907fff723d9b8b7436113a
postbbs_1 | 123
(2 rows)

postgres=# alter role postbbs_1 rename to postbbs;
ALTER ROLE
postgres=# SELECT rolname,rolpassword FROM pg_authid;
rolname | rolpassword
----------+-------------------------------------
postgres | md59df270eb52907fff723d9b8b7436113a
postbbs | 123
(2 rows)

postgres=# \c postgres postbbs
Password for user postbbs:
You are now connected to database "postgres" as user "postbbs".
postgres=>

采用明码密码存储的话,修改前后密码保持不变,所以可以认证

所以修改MD5加密认证用户名时应采用这样的做法,这一点本人认为有些不友好,因为原来md5密码我们是不知道明文的

postgres=> \c postgres postgres
Password for user postgres:
You are now connected to database "postgres" as user "postgres".
postgres=# alter role postbbs rename to postbbs_1;
ALTER ROLE
postgres=# alter role postbbs_1 with password '123';
ALTER ROLE
postgres=#

六、一台主机上将了多个不同port的Postgresql服务,连接时指向的port不正确

[postgres @ pgsqldb-master bin]$ psql -h 192.168.1.100 -U postgres -d postgres
Password for user postgres:
psql: FATAL: password authentication failed for user "postgres"

默认的5432 port里面的用户postgres密码不是123

[postgres@pgsqldb-master bin]$ psql -h 192.168.1.100 -U postgres -d postgres -p 9240
Password for user postgres:
psql (9.2.3, server 9.2.4)
Type "help" for help.

postgres=#

port 为9240的用户postgres 密码才是123

这样的错误也是属于比较大头虾的错误

  • 大小: 39.2 KB
分享到:
评论

相关推荐

    navicat 连接PostgreSQL报错

    在使用 Navicat 连接 PostgreSQL 数据库时遇到“ERROR: SSL connection is required by the database system”错误提示的情况并不罕见。本文将详细介绍该问题的原因、解决思路以及具体的解决方案。 #### 问题描述 ...

    navicat 连接 postgresql 连不上的问题

    在linux上装 postgresql 在 windows或 linux 连不上的问题的解决方法!

    CodeSmith8.0.1连接PostgreSQL报错问题解决

    本文将详述CodeSmith 8.0.1版本在尝试连接到PostgreSQL数据库时遇到的问题,以及如何通过添加必要的DLL文件和理解连接字符串来解决这个问题。 首先,CodeSmith是一款强大的代码生成器,它允许开发者通过模板语言...

    Matlab与PostgreSQL数据库的连接

    连接字符串的格式为:jdbc:postgresql://localhost:5432/database_name,其中,localhost 是服务器的地址,5432 是 PostgreSQL 数据库的默认端口号,database_name 是数据库的名称。 知识点:Matlab 的数据库操作 ...

    Arcgis连接 postgresql sde 时遇到的问题以及解决办法

    在使用ArcGIS与PostgreSQL SDE进行数据交互时,可能会遇到一些技术问题。本文将针对这些问题提供解决方案,并介绍相关的DLL文件及其作用。 首先,PostgreSQL是一个开源的关系型数据库管理系统,而SDE(Spatial ...

    PostgreSQL JDBCL连接:postgresql-42.2.5.jar包.zip

    implementation 'org.postgresql:postgresql:42.2.5' ``` **3. 建立连接** 使用JDBC连接PostgreSQL数据库的基本步骤如下: ```java import java.sql.Connection; import java.sql.DriverManager; public class ...

    使用Druid数据连接池连接PostgreSQL简单例子

    spring.datasource.druid.url=jdbc:postgresql://localhost:5432/testdb spring.datasource.druid.username=myuser spring.datasource.druid.password=mypassword spring.datasource.druid.initial-size=5 spring....

    连接postgresql数据库需要的jar包

    3. **建立连接**:在Java代码中,你可以使用`Class.forName()`方法加载JDBC驱动,然后使用`DriverManager.getConnection()`方法创建数据库连接。例如: ```java import java.sql.Connection; import java.sql....

    Jdbc连接postgresql数据库(源码+jar包)

    String url = "jdbc:postgresql://localhost:5432/mydatabase"; String user = "username"; String password = "password"; Connection conn = DriverManager.getConnection(url, user, password); ``` 这里...

    MyBatis通过 JDBC连接 PostgreSQL数据库 最小例子

    <property name="url" value="jdbc:postgresql://localhost:5432/your_database_name"/> <property name="password" value="your_password"/> ``` 确保将上述配置中的`your_database_name`, `your_...

    C#连接PostgreSQL数据库的驱动

    C#连接PostgreSQL数据库的驱动:Mono.Security.dll、Npgsql.dll

    presto部署并连接postgresql

    connection-url=jdbc:postgresql://<postgresql_host>:<port>/ connection-user= connection-password=<password> ``` 5. **启动Presto**:在配置完成后,你可以通过运行`bin/launcher start`命令启动Presto...

    asp连接postgresql数据库

    asp连接postgresql数据库 的源码

    Navicat for PostgreSQL 11.2

    《Navicat for PostgreSQL 11.2:高效管理PostgreSQL数据库的利器》 Navicat for PostgreSQL 11.2是一款专为PostgreSQL数据库设计的强大管理工具,它集成了多种功能,使得数据库管理和开发变得更加便捷高效。在安装...

    PostGreSQL安装部署系列:Centos 7.9 安装指定PostGreSQL-15版本数据库

    为了确保每次系统启动时PostgreSQL服务都能自动启动,还需要执行以下命令: ```bash sudo systemctl enable postgresql-15 ``` #### 四、配置与管理 安装完成后,还需要对PostgreSQL进行一些基本的配置,例如修改...

    封装连接PostgreSQL类

    这通常涉及设置DSN(数据源名称)、用户名、密码、主机名和端口号等参数,并使用libpq(PostgreSQL的C API)来执行实际的连接操作。`libpq`提供的`PGconn`结构体是连接句柄,用于后续的数据库操作。 2. **参数化...

    JDBC 连接到 PostgreSQL 数据库获取数据简单例子

    String url = "jdbc:postgresql://localhost:5432/your_database"; String user = "your_username"; String password = "your_password"; Connection conn = DriverManager.getConnection(url, user, password);...

    Postgresql连接oracle驱动并实现读写

    ### Postgresql连接Oracle数据库并通过oracle_fdw驱动实现读写操作 #### 一、概述 本文档将详细介绍如何在CentOS 6.2环境下通过PostgreSQL 9.5.6使用`oracle_fdw`驱动程序来连接Oracle 11.2客户端,并实现数据的...

    ASP.Net2.0连接PostgreSQL数据库(C#).txt

    在连接PostgreSQL时,一个重要的工具是PostgreSQLDirect.NET。这是一个专门为Microsoft .NET Framework提供直接访问PostgreSQL数据库功能的库,它完全符合ADO.NET标准,提供了与标准ADO.NET库相同的功能和使用方式。...

Global site tag (gtag.js) - Google Analytics