簡體   English   中英

Postgresql JDBC Driver是否支持Pgpass身份驗證?

[英]Does the Postgresql JDBC Driver support Pgpass authentication?

我正在嘗試使用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 我似乎無法在任何地方找到一個authoritave答案。

不,PgJDBC不讀.pgpass

$ cd projects/pgjdbc
$ git grep pgpass
$ 

您的Java程序需要打開並解析.pgpass然后對連接進行適當的匹配。

如果你編寫一個類來讀取和解析.pgpass並為一組給定的連接參數匹配它,請提交它以包含在PgJDBC驅動程序中,它將放在包org.postgresql.util

您可能會發現直接修改JDBC驅動程序更容易,如果JDBC驅動程序已將JDBC URL解析為主機,端口等,則在連接參數中未指定密碼時查找密碼。

這是一個從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))
  }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM