Подключение к Postgre на удаленном хосте

201
01 ноября 2018, 07:30

Я новичок в вопросах работы с БД с внешней стороны. Написал код на Java, с помощью которого пытаюсь установить соединение с базой на хостинге (в сервлете).

public class Database {
    private static String url = "jdbc:postgresql:tdb";
    private static Properties props = new Properties();
    private static Connection conn;
    static {
        props.setProperty("user", "postgres");
        props.setProperty("password", "123");
        props.setProperty("charSet ", "UTF8");
        try {
            Class.forName("org.postgresql.Driver");
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
        initConn();
    }
    public static boolean initConn() {
        try {
            if (conn == null || conn.isClosed()) {
                conn = DriverManager.getConnection(url, props);
            }
        } catch (SQLException e) {
            return false;
        }
        return true;
    }
    public static Connection getConn() throws SQLException {
        if (conn == null || conn.isClosed()) //перестраховка
            initConn();
        return conn;
    }
...
//Далее ошибка при вызове:
getConn().createStatement();
...

На моей локальной машине (Windows) такой способ коннекта работает, но на хостинге нет. Там я получаю ошибку:

13-Aug-2018 17:01:11.418 SEVERE [http-nio-80-exec-6] org.postgresql.Driver.connect Connection error: 
 org.postgresql.util.PSQLException: FATAL: no pg_hba.conf entry for host "127.0.0.1", user "postgres", database "tdb", SSL off
    at org.postgresql.core.v3.ConnectionFactoryImpl.doAuthentication(ConnectionFactoryImpl.java:438)
    at 
....
 13-Aug-2018 17:14:26.094 SEVERE [http-nio-80-exec-1] org.postgresql.Driver.connect Connection error: 
 org.postgresql.util.PSQLException: FATAL: password authentication failed for user "postgres"
    at org.postgresql.core.v3.ConnectionFactoryImpl.doAuthentication(ConnectionFactoryImpl.java:438)
    at 
.... 

База на хостинге совершенно точно существует, и доступна, но через Putty я подключаюсь к ней иначе, чем на винде:

[root@lfwg ~]#  sudo -i -u postgres
-bash-4.2$ psql
postgres=# \c tdb
You are now connected to database "tdb" as user "postgres".
tdb=# select * from responds;
 id | resp_ref | username | user_id | battle_count | win_rate | own_rate | cr_date
----+----------+----------+---------+--------------+----------+----------+---------
(0 rows)

Может ли быть проблема в способе подключения?
Получается, что я не указываю пароль для подключения на хосте, а тот пароль что прописан в коде подходит только в базе на локальной машине.
Пароль я сменить побоялся в связи с недостаточным знакомством с Unix, и возможным последствиям в виде проблем работы Postgres.

Пожалуйста, подскажите как можно прописать универсальный способ подключения, чтобы код, разрабатываемый на Windows был работоспособен коду на хосте? Все-таки Java.

========================================================================== UPD: да, пробовал править pg_hba.conf
в данный момент тут всего 4 строки, и как я понял, доступ к базе максимально открыт на хосте:

# TYPE  DATABASE        USER            ADDRESS                 METHOD
# "local" is for Unix domain socket connections only
local   all             all                                     peer
# IPv4 local connections:
#host    all             all             127.0.0.1/32            md5
 host    all             all             0.0.0.0/32             md5
 host    all             all             0.0.0.0/0              md5
# IPv6 local connections:
host    all             all             ::1/128                 md5

========================================================================== UPD#2: Добавил строку в конфиг:

 host    tdb             username        127.0.0.1/32           password

Создал пользователя tester с паролем test

login as: tester
tester@<IP_ADDRES>'s password:
Last login: Tue Aug 14 13:27:29 2018 from ppp91-78-97-34.pppoe.mtu-net.ru
[tester@lfwg ~]$ psql
psql (9.2.23)
Type "help" for help.
tester=# \c tdb
You are now connected to database "tdb" as user "tester".
tdb=#

В java коде изменил строку подключения на следующий вид:

DriverManager.getConnection("jdbc:postgresql://127.0.0.1:5432/tdb","tester", "test");

В сервер-логе ошибка подключения:

14-Aug-2018 18:11:54.657 SEVERE [http-nio-80-exec-1] org.postgresql.Driver.connect Connection error: 
 org.postgresql.util.PSQLException: FATAL: password authentication failed for user "tester"
    at 
    org.postgresql.core.v3.ConnectionFactoryImpl.doAuthentication(ConnectionFactoryImpl.java:438)...

Может еще кто-нибудь что-то подсказать?

Answer 1

Во-первых, не стоит работать с базой из под пользователя postgres. Он для системных нужд и у него слишком много прав. Создайте отдельного пользователя и выдайте ему права на БД. Во-вторых, судя по

no pg_hba.conf entry for host "127.0.0.1", user "postgres", database "tdb"

надо в pg_hba.conf добавить

host    tdb             username             127.0.0.1/32                 password
Answer 2

Для локального подключения у вас в pg_hba.conf - peer, то есть существующие пользователи в системе могут подключаться. Так что хост задавать обязательно при подключении, чтобы попасть на правило:

host    all      all      0.0.0.0/32        md5

например

psql -U postgres -d tdb -h 127.0.0.1

p.s. Хотя, может быть проще заменить в "pg_hba.conf" параметр "peer" на "md5".

READ ALSO
Почему нужно указывать объект в блоке synchronised?

Почему нужно указывать объект в блоке synchronised?

Почему нужно указывать объект? Ведь мы можем вообще не использовать этот объект в блоке

182
Что значит аннотация @HotSpotIntrinsicCandidate?

Что значит аннотация @HotSpotIntrinsicCandidate?

Смотрел JVM, наткнулся на аннотацию @HotSpotIntrinsicCandidate, довольно часто ее стал встречатьЧто она значит? Раньше ее не было

178
Настройка конфигурации Hibernate в Spring

Настройка конфигурации Hibernate в Spring

Использую версии Spring 50

195
generic массивы и new T()

generic массивы и new T()

Java документация гласит, что джинерики работают с помощью механизма "стирания", те

218