为什么我得到 SQL State: 28000 FATAL: Ident authentication failed for user error message when 运行 a simple Java program?
Why am I getting SQL State: 28000 FATAL: Ident authentication failed for user error message when running a simple Java program?
我有一台 Postgres 11 database installed on a VirtualBox virtual machine running Centos7(客机),我的主机是一台 Mac OS Catalina。客户机 (Centos) 和主机 (Catalina) 都安装了 JDK 8。
我有以下使用单个依赖项的简单 Java 代码 postgresql-42.2.5:
public class JavaApplication5 {
public static void main(String[] args) {
try (Connection conn = DriverManager.getConnection(
"jdbc:postgresql://127.0.0.1:5332/mydb", "mydbuser", "mydbpassword")) {
if (conn != null) {
System.out.println("Connected to the database!");
} else {
System.out.println("Failed to make connection!");
}
} catch (SQLException e) {
System.err.format("SQL State: %s\n%s", e.getSQLState(), e.getMessage());
} catch (Exception e) {
e.printStackTrace();
}
}
}
我在我的主机 (Catalina) 上编译并 运行 :
java -jar JavaApplication5.jar
我得到的输出是:
Connected to the database!
很明显,这意味着我可以从我的主机到我的来宾连接到 Postgres 数据库。接下来,我测试是否可以直接从我的来宾连接。所以我将“JavaApplication5.jar”复制到来宾Virtual Machine 运行ning Centos 7 中并重新运行 相同的命令。但是,这次我从同一个可执行 jar 文件中收到以下消息:
SQL State: 28000
FATAL: Ident authentication failed for user "mydbuser"
有人知道为什么我在来宾虚拟机上出现此错误但在主机上却没有吗?
这是我的 pg_hba.conf 文件的相关部分:
# TYPE DATABASE USER ADDRESS METHOD
# "local" is for Unix domain socket connections only
local all all trust
# IPv4 local connections:
host all all 127.0.0.1/32 ident
# IPv6 local connections:
host all all ::1/128 ident
# Allow replication connections from localhost, by a user with the
# replication privilege.
local replication all peer
host replication all 127.0.0.1/32 ident
host replication all ::1/128 ident
host all all 0.0.0.0/0 md5
您在两台机器上都使用硬编码 127.0.0.1。 127.0.0.1 应换出为数据库主机的 IP 地址或其 FQDN。 5332 而不是 5432 是不寻常的。
您必须在 VirtualBox 中设置端口转发才能捕获主机上到该端口的连接尝试并将它们路由到 VB。因此,当您指定 127.0.0.1 时,就 PostgreSQL 而言,它们来自其他地方。这与您的 pg_hba.conf 的 'md5' 行匹配。从来宾完成后,连接实际上来自 127.0.0.1,因此与前面的 'ident' 行匹配。
'ident' 身份验证失败,原因肯定在日志文件中提到。如果您不想使用 'ident',请删除这些行。
我有一台 Postgres 11 database installed on a VirtualBox virtual machine running Centos7(客机),我的主机是一台 Mac OS Catalina。客户机 (Centos) 和主机 (Catalina) 都安装了 JDK 8。
我有以下使用单个依赖项的简单 Java 代码 postgresql-42.2.5:
public class JavaApplication5 {
public static void main(String[] args) {
try (Connection conn = DriverManager.getConnection(
"jdbc:postgresql://127.0.0.1:5332/mydb", "mydbuser", "mydbpassword")) {
if (conn != null) {
System.out.println("Connected to the database!");
} else {
System.out.println("Failed to make connection!");
}
} catch (SQLException e) {
System.err.format("SQL State: %s\n%s", e.getSQLState(), e.getMessage());
} catch (Exception e) {
e.printStackTrace();
}
}
}
我在我的主机 (Catalina) 上编译并 运行 :
java -jar JavaApplication5.jar
我得到的输出是:
Connected to the database!
很明显,这意味着我可以从我的主机到我的来宾连接到 Postgres 数据库。接下来,我测试是否可以直接从我的来宾连接。所以我将“JavaApplication5.jar”复制到来宾Virtual Machine 运行ning Centos 7 中并重新运行 相同的命令。但是,这次我从同一个可执行 jar 文件中收到以下消息:
SQL State: 28000
FATAL: Ident authentication failed for user "mydbuser"
有人知道为什么我在来宾虚拟机上出现此错误但在主机上却没有吗?
这是我的 pg_hba.conf 文件的相关部分:
# TYPE DATABASE USER ADDRESS METHOD
# "local" is for Unix domain socket connections only
local all all trust
# IPv4 local connections:
host all all 127.0.0.1/32 ident
# IPv6 local connections:
host all all ::1/128 ident
# Allow replication connections from localhost, by a user with the
# replication privilege.
local replication all peer
host replication all 127.0.0.1/32 ident
host replication all ::1/128 ident
host all all 0.0.0.0/0 md5
您在两台机器上都使用硬编码 127.0.0.1。 127.0.0.1 应换出为数据库主机的 IP 地址或其 FQDN。 5332 而不是 5432 是不寻常的。
您必须在 VirtualBox 中设置端口转发才能捕获主机上到该端口的连接尝试并将它们路由到 VB。因此,当您指定 127.0.0.1 时,就 PostgreSQL 而言,它们来自其他地方。这与您的 pg_hba.conf 的 'md5' 行匹配。从来宾完成后,连接实际上来自 127.0.0.1,因此与前面的 'ident' 行匹配。
'ident' 身份验证失败,原因肯定在日志文件中提到。如果您不想使用 'ident',请删除这些行。