【问题标题】:Does the Postgresql JDBC Driver support Pgpass authentication?Postgresql JDBC Driver 是否支持 Pgpass 身份验证?
【发布时间】:2014-01-31 04:42:13
【问题描述】:

我正在尝试使用 JDBC Driver 从 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 驱动程序是否支持 pgpass?

我能找到的唯一线索是在 SO 中,似乎表明 since the driver does not use libpq, then it cannot use pgpass。不过,我似乎在任何地方都找不到权威的答案。

【问题讨论】:

  • 嗨,罗德里格,您能联系我 at momomo DOT com 的首席执行官吗?找不到您的电子邮件,因此采用了这种尴尬的联系方式。这与一份出色的工作机会有关。

标签: java postgresql jdbc


【解决方案1】:

不,PgJDBC 不读取 .pgpass

$ cd projects/pgjdbc
$ git grep pgpass
$ 

您的 Java 程序需要打开并解析 .pgpass,然后对连接进行适当的匹配。

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

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-07-12
      • 2016-05-01
      • 1970-01-01
      • 2020-01-08
      • 2021-01-29
      • 1970-01-01
      • 1970-01-01
      • 2021-02-05
      相关资源
      最近更新 更多