Pytanie Czy sterownik JDBC Postgresql obsługuje uwierzytelnianie Pgpass?


Próbuję połączyć się z bazą danych Postgresql z Java przy użyciu Sterownik JDBC i chciałbym użyć pgpass uwierzytelnić.

Mój serwer Postgresql jest poprawnie skonfigurowany do uwierzytelniania haseł i mam lokalny .pgpass plik; Mogę się połączyć używając psql bez konieczności podawania hasła użytkownika. Jednak gdy próbuję otworzyć połączenie w Javie, pojawia się następujący błąd:

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

Korzystam z następującego kodu:

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

Moje pytanie brzmi: czy sterownik Postgres JDBC obsługuje pgpass?

Jedyną wskazówką, jaką mogłem znaleźć, jest SO i wydaje się to wskazywać ponieważ sterownik nie używa libpq, to ​​nie może używać pgpass. Nie mogę jednak znaleźć nigdzie odpowiedzi autorytatywnej.


11
2018-01-12 11:53


pochodzenie


Cześć Rodrigue, czy mógłbyś skontaktować się ze mną w ceo AT momomo DOT com? Nie można znaleźć Twojego e-maila, stąd ten niezręczny sposób dotarcia. Ma to związek ze wspaniałą ofertą pracy. - momo


Odpowiedzi:


Nie, PgJDBC nie czyta .pgpass.

$ cd projects/pgjdbc
$ git grep pgpass
$ 

Twój program Java będzie musiał otworzyć i przeanalizować .pgpass następnie wykonaj odpowiednie dopasowanie dla połączenia.

Jeśli napiszesz klasę do czytania i parsowania .pgpass i aby dopasować go do danego zestawu parametrów połączenia, prześlij go do włączenia do sterownika PgJDBC, gdzie znajdzie się pod pakietem org.postgresql.util.

Może się okazać, że łatwiej jest zmodyfikować sterownik JDBC bezpośrednio, szukając hasła, jeśli żadna nie zostanie określona w parametrach połączenia, gdy sterownik JDBC przetworzy już adres URL JDBC na hoście, porcie itp.


9
2018-01-12 12:04





Oto narzędzie do odczytu hasła z pliku .pgpass w Scali,

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