代码之家  ›  专栏  ›  技术社区  ›  user1068636

为什么我在运行简单Java程序时收到SQL State:28000 FATAL:Ident authentication failed for user错误消息?

  •  0
  • user1068636  · 技术社区  · 5 年前

    我有一个 Postgres 11数据库安装在 VirtualBox 虚拟机正在运行 Centos7

    我有以下使用单个依赖项的简单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();
            }
        }
        
    }
    

    java -jar JavaApplication5.jar 
    

    我得到的结果是:

    Connected to the database!
    

    所以很明显,这意味着我可以连接到Postgres数据库从我的主机到我的客人。接下来,我测试是否可以直接从我的客人那里连接。因此,我将“JavaApplication5.jar”复制到运行centos7的客户虚拟机中,并重新运行相同的命令。不过,这次我从同一个可执行jar文件中得到以下消息:

    SQL State: 28000
    FATAL: Ident authentication failed for user "mydbuser"
    

    有人知道为什么我在来宾虚拟机上而不是主机上出现此错误吗?

    # 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
    
    0 回复  |  直到 5 年前
        1
  •  1
  •   jjanes    5 年前

    必须在VirtualBox中设置端口转发,以捕获主机上到该端口的连接尝试,并将它们路由到VB。因此,虽然您指定了127.0.0.1,但就PostgreSQL而言,它们来自其他地方。与pg_hba.conf的“md5”行匹配。在guest中完成时,连接实际上来自127.0.0.1,因此与前面的“ident”行匹配。

        2
  •  0
  •   Emmett    5 年前

    两台机器上都使用了硬编码127.0.0.1。127.0.0.1应换成数据库主机的IP地址或其FQDN。5332而不是5432是不寻常的。