PostgreSQL JDBC驱动程序是否支持Pgpass身份验证?

12

我正在尝试使用JDBC驱动程序从Java连接到PostgreSQL数据库,并希望使用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。但我似乎无法在任何地方找到权威的答案。


嗨,罗德里格,能否请您通过ceo AT momomo DOT com与我联系?找不到您的电子邮件,因此采用这种尴尬的联系方式。这与一份激动人心的工作机会有关。 - mjs
2个回答

10

不,PgJDBC不会读取.pgpass文件。

$ cd projects/pgjdbc
$ git grep pgpass
$ 

你的Java程序需要打开并解析.pgpass文件,然后针对连接进行相应的匹配。

如果您编写一个类来读取和解析.pgpass文件,并根据给定的连接参数进行匹配,请将其提交以包含在PgJDBC驱动程序中,它将位于org.postgresql.util包下面。

如果在JDBC驱动程序已将JDBC URL解析为主机名、端口等之后,在连接参数中没有指定密码,则直接修改JDBC驱动程序可能会更容易。


1

这是一个用于在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))
  }
}

pgpass 可能包含通配符 * - mlt

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接