当我尝试使用我的凭据(pgadmin iii - postgres sqltool)连接到我的 PostgreSQL 服务器时,它工作正常。当我尝试从 java 应用程序连接时,我收到以下日志。很奇怪
org.springframework.transaction.CannotCreateTransactionException: Could not open JDBC Connection for transaction; nested exception is org.postgresql.util.PSQLException: FATAL: password authentication failed for user "admin"
at org.springframework.jdbc.datasource.DataSourceTransactionManager.doBegin(DataSourceTransactionManager.java:240)
at org.springframework.transaction.support.AbstractPlatformTransactionManager.getTransaction(AbstractPlatformTransactionManager.java:371)
at org.springframework.transaction.interceptor.TransactionAspectSupport.createTransactionIfNecessary(TransactionAspectSupport.java:335)
at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:105)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172)
at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:202)
at $Proxy8.getCollegeDetails(Unknown Source)
at com.cts.bo.HESBO.registerCourse(HESBO.java:42)
at com.cts.facade.HESFacade.registerCourse(HESFacade.java:34)
at com.cts.manager.HESManager.registerCourse(HESManager.java:34)
at com.cts.presentation.Tester.registerCourse(Tester.java:66)
at com.cts.presentation.Tester.main(Tester.java:159)
**Caused by: org.postgresql.util.PSQLException: FATAL: password authentication failed for user "admin"**
at org.postgresql.core.v3.ConnectionFactoryImpl.doAuthentication(ConnectionFactoryImpl.java:415)
at org.postgresql.core.v3.ConnectionFactoryImpl.openConnectionImpl(ConnectionFactoryImpl.java:188)
at org.postgresql.core.ConnectionFactory.openConnection(ConnectionFactory.java:64)
at org.postgresql.jdbc2.AbstractJdbc2Connection.<init>(AbstractJdbc2Connection.java:143)
at org.postgresql.jdbc3.AbstractJdbc3Connection.<init>(AbstractJdbc3Connection.java:29)
at org.postgresql.jdbc3g.AbstractJdbc3gConnection.<init>(AbstractJdbc3gConnection.java:21)
at org.postgresql.jdbc3g.Jdbc3gConnection.<init>(Jdbc3gConnection.java:24)
at org.postgresql.Driver.makeConnection(Driver.java:412)
at org.postgresql.Driver.connect(Driver.java:280)
at java.sql.DriverManager.getConnection(Unknown Source)
at java.sql.DriverManager.getConnection(Unknown Source)
at org.springframework.jdbc.datasource.DriverManagerDataSource.getConnectionFromDriverManager(DriverManagerDataSource.java:173)
at org.springframework.jdbc.datasource.DriverManagerDataSource.getConnectionFromDriver(DriverManagerDataSource.java:164)
at org.springframework.jdbc.datasource.AbstractDriverBasedDataSource.getConnectionFromDriver(AbstractDriverBasedDataSource.java:149)
at org.springframework.jdbc.datasource.AbstractDriverBasedDataSource.getConnection(AbstractDriverBasedDataSource.java:119)
at org.springframework.jdbc.datasource.DataSourceTransactionManager.doBegin(DataSourceTransactionManager.java:202)
... 11 more
.属性文件
jdbc.driverClassName=org.postgresql.Driver
jdbc.url=jdbc:postgresql://localhost:5432/postgres
jdbc.password=admin
jdbc.username=admin
spring.xml
<bean
class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
<property name="location">
<value>com\cts\resource\constant.properties</value>
</property>
</bean>
<bean id="dataSource"
class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName" value="${jdbc.driverClassName}" />
<property name="url" value="${jdbc.url}" />
<property name="username" value="${jdbc.username}" />
<property name="password" value="${jdbc.password}" />
</bean>
<bean id="transactionManager"
class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"/>
</bean>
非常感谢对此的任何帮助,我只是因为这个奇怪的错误而无法取得进展。
我认为问题可能是 postgres 数据库配置为允许使用 md5 哈希的唯一密码。
您可以通过查看配置文件
pg_hba.conf
来检查这是否属实。
如果您发现属性配置如下,请使用以下属性进行搜索host all all all
:
host all all all md5
问题是您需要将密码哈希为 md5。您可以通过将配置更改为来解决此问题:
trust
而不是 md5
-> 将允许用户无需任何密码即可连接password
而不是 md5
-> 将允许用户使用纯文本密码进行连接您可能需要允许一个 IP 或一系列 IP 地址连接到 PostgreSQL。
例如,如果您使用 Docker,问题可能是您不允许 PostgreSQL 使用 Docker 网络。
ip addr show docker0 | grep 'inet'
);pg_hba.conf
中的 Postgre。例如,如果您只想允许 IP 地址,请在末尾使用
地址或在后面写入/32
子网掩码,如图所示 如下:255.255.255.255
host all all 172.17.0.1 255.255.255.255 md5
或
host all all 172.17.0.1/32 md5
阅读 PostgreSQL 文档,了解有关
pg_hba.conf
文件结构的更多信息。
在登录部分创建一个新用户并在 application.properties 中使用它,解决了这个问题。
尽管我在 Docker 容器内运行 PostgreSQL 服务器,但我也遇到了同样的问题。我通过使用不同的端口映射(例如 0.0.0.0:5433->5432/tcp)修复了它。
症状及调试:
错误消息为“org.postgresql.util.PSQLException: FATAL: user xxx 密码验证失败”。
更改 JDBC 主机、端口或用户名会导致不同的错误消息。
PgAdmin 能够连接到数据库。
PgAdmin 连接显示在 PostgreSQL 日志中(启用连接日志记录后),但尝试使用 JDBC 连接时未显示任何内容。
tcpdump port 5432
尝试使用 JDBC 连接时没有显示任何内容,但在使用 PgAdmin 连接或使用 netcat 发送随机数据时显示一些内容。
最终根本原因仍不清楚。但显然这不是密码问题,所以 JDBC 驱动程序不应该说是这样。
在 Windows 10 上运行的 Docker 版本 20.10.17。PostgreSQL 驱动程序版本为 42.4.1。
对我来说,当我更新版本时它起作用了
<dependency>
<groupId>org.postgresql</groupId>
<artifactId>postgresql</artifactId>
<scope>runtime</scope>
<version>42.5.0</version>
</dependency>
我们遇到了类似的问题,但这是存储在 GCP 秘密管理器中的密码中的新行。相同的密码在 oracle 上也有效。所以oracle足够聪明,可以修剪密码