问题 Postgresql JDBC Driver是否支持Pgpass身份验证?


我正在尝试使用Java从Java连接到Postgresql数据库 JDBC驱动程序 并想使用 pgpass 进行身份验证。

我的Postgresql服务器正确设置为密码验证,我有一个本地 .pgpass 文件;我可以用连接 PSQL 无需提供用户密码。但是,当我尝试在Java中打开连接时,我收到以下错误:

org.postgresql.util.PSQLException: The server requested password-based authentication, but no password was provided.

我使用以下代码:

String url = "jdbc:postgresql://localhost/test";
Properties props = new Properties();
props.setProperty("user","my_user");
Connection conn = DriverManager.getConnection(url, props);

我的问题是:Postgres JDBC Driver是否支持pgpass?

我能找到的唯一线索是SO,似乎表明了这一点 由于驱动程序不使用libpq,因此无法使用pgpass。我似乎无法在任何地方找到一个authoritave答案。


6602
2018-01-12 11:53


起源

嗨罗德里格,你能否在ceo AT momomo DOT com与我联系?无法找到您的电子邮件,因此这种尴尬的方式伸出援手。这与优秀的工作机会有关。 - momo


答案:


不,PgJDBC不读 .pgpass

$ cd projects/pgjdbc
$ git grep pgpass
$ 

您的Java程序需要打开并解析 .pgpass 然后为连接做适当的匹配。

如果你写一个类来阅读和解析 .pgpass 并为一组给定的连接参数匹配它,请提交它以包含在PgJDBC驱动程序中,它将在包装下 org.postgresql.util

您可能会发现直接修改JDBC驱动程序更容易,如果JDBC驱动程序已将JDBC URL解析为主机,端口等,则在连接参数中未指定密码时查找密码。


9
2018-01-12 12:04





这是一个从Scala中读取.pgpass文件密码的工具,

object DbUtil {
  def dbPassword(hostname:String, port:String, database:String, username:String ):String = {
    // Usage: val thatPassWord = dbPassword(hostname,port,database,username)
    // .pgpass file format, hostname:port:database:username:password
    val passwdFile = new java.io.File(scala.sys.env("HOME"), ".pgpass")
    var passwd = ""
    val fileSrc = scala.io.Source.fromFile(passwdFile)
    fileSrc.getLines.foreach{line =>
      val connCfg = line.split(":")
      if (hostname == connCfg(0)
        && port == connCfg(1)
        && database == connCfg(2)
        && username == connCfg(3)
      ) { 
        passwd = connCfg(4)
      }
    }
    fileSrc.close
    passwd
  }

  def passwordFromConn(connStr:String) = {
    // Usage: passwordFromConn("hostname:port:database:username")
    val connCfg = connStr.split(":")
    dbPassword(connCfg(0),connCfg(1),connCfg(2),connCfg(3))
  }
}

0
2018-04-05 18:25