我正在尝试使用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 Driver是否支持pgpass?
我能找到的唯一线索是在SO中,似乎表明since the driver does not use libpq, then it cannot use pgpass。我似乎无法在任何地方找到一份授权答案。
答案 0 :(得分:9)
不,PgJDBC没有阅读.pgpass
。
$ cd projects/pgjdbc
$ git grep pgpass
$
您的Java程序需要打开并解析.pgpass
,然后对连接进行适当的匹配。
如果您编写一个类来阅读和解析.pgpass
并为一组给定的连接参数匹配它,请提交它以包含在PgJDBC驱动程序中,它将放在包{{1}下}}。
如果JDBC驱动程序已将JDBC URL解析为主机,端口等,您可能会发现直接修改JDBC驱动程序更容易,如果在连接参数中未指定密码,则查找密码。
答案 1 :(得分: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))
}
}