2012-11-13 18 views
2

我試圖通過JDBC驅動程序連接到Ubuntu 10.10中的PostgreSQL 8.4 DB。我通過jdbc:postgresql:localhost:5433/dbname連接,因爲PostgreSQL在非默認端口5433上運行,所以我必須指定端口。通過JDBC在Postgresql 8.4上設置沒有密碼的用戶連接

我已經編輯了我的postgresql.conf以設置listen_addresses = "*"。我明白,即使它是本地主機,它仍然使用TCP/IP通過JDBC進行連接。

我的問題是我創建了一個沒有密碼的用戶。如果我沒有用DriverManager.connect(url)指定密碼,則表明我需要指定密碼進行驗證。我嘗試的每個密碼(包括空字符串)都無法通過數據庫進行身份驗證。

如何連接?

編輯: 如果通過錯誤的端口連接,錯誤是:PSQLException:連接被拒絕。檢查主機名和端口是否正確,並且postmaster正在接受TCP/IP連接。當試圖連接正確的端口時,我得到PSQLException:致命:用戶「用戶」的密碼驗證失敗。這可以通過下面接受的答案來彌補。

+1

顯示完整的,準確的錯誤信息和堆棧跟蹤。您的標題顯示「連接被拒絕」,但您的文本顯示「我需要指定密碼進行身份驗證的錯誤」。這些是完全不同的東西;在後一種情況下,成功完成TCP/IP連接,然後拒絕認證。從描述中可以看出,當連接到默認端口5432時,連接被拒絕,因爲Pg運行在端口5433上,但實際的*問題*與連接拒絕錯誤以及與身份驗證有關的一切無關。另外:PostgreSQL ** 8.8 **? 8.4? –

+0

[Here](http://www.postgresql.org/support/versioning/)你可以找到實際存在的PostgreSQL版本,「8.8」不在其中。 –

+0

克雷格,我的歉意,我在posgres 8.4。至於我的錯誤,是的,我根據端口收到不同的錯誤。看起來我確實是在5433.當我嘗試了不同的端口時,我得到了一個拒絕的連接,這意味着更多的是網絡問題(錯誤的端口)。我知道有時在SQLServer中,錯誤是非常通用的,並且認證錯誤並不一定意味着指定的數據庫存在,或者實際上可能是權限問題。 –

回答

10

如果你有pg_hba.conf設置爲需要md5認證和用戶沒有密碼,那麼就不會發生驗證。

ALTER USER the_user_name PASSWORD 'give_it_a_password'; 

或者,使用ident或者(僅適用於本地主機,不安全)trust驗證該用戶/ DB組合在pg_hba.conf如果你真的必須有沒有密碼。這通常是一個壞主意,只要設置密碼就好多了。

演示:

$ psql -q -U postgres postgres 
postgres=# CREATE USER nopw; 
CREATE ROLE 

$ psql -h localhost -U nopw postgres 
Password for user nopw:    [pressed enter] 
psql: fe_sendauth: no password supplied 

$ psql -q -U postgres postgres 
postgres=# ALTER USER nopw PASSWORD 'test'; 
postgres=# \q 

$ psql -q -h localhost -U nopw postgres 
Password for user nopw:   [entered 'test' then pressed enter] 
postgres=> 
+0

在我的本地開發機器上,我可以按照您的建議將其設置爲信任模式。我完全同意指定密碼是最好的。 –

+0

我創建了用戶,但以某種方式沒有'-h localhost'選項,我永遠無法登錄。保持獲得錯誤'psql:FATAL:用戶「test」的對等認證失敗。這是否意味着它試圖連接到其他主機?這根本沒有意義。 – asgs

+1

@asgs閱讀手冊的「客戶端身份驗證」一章,並閱讀「pg_hba.conf」。 TL; DR是,你有一個不同的身份驗證方法配置爲通過unix套接字進行本地連接('local'模式),而不是通過'pg_hba.conf'中的tcp/ip連接('host'模式) –

2

連接到您的數據庫:

import java.sql.Connection; 
    import java.sql.DriverManager; 
    import java.sql.SQLException; 

    private final String url = "jdbc:postgresql://localhost:5432/dbname"; 
    private final String driver = "org.postgresql.Driver"; 
    private final String login = "username"; 
    private final String password = ""; 
     private Connection connection = null; 
    //... 
    try { 
    Class.forName(driver); 
     connection = DriverManager.getConnection(url, 
       login, password); 
    } catch (SQLException e) { 
     System.out.print(" Unable set the connection!"); 
    } catch (ClassNotFoundException e) { 
     System.out.print(" Unable to load the driver class!"); 
    } 
+0

如果我用端口5433做這個,我得到一個PSQLException,密碼認證失敗。如果我使用端口5422(或不指定端口)執行此操作,則會收到Connection Refused,要求檢查主機名和端口。 –

+0

通過指定正確的端口,通過指定一個空密碼,這是連接的正確方式,如果這是用戶設置的方式。 –

+0

負面 - 沒有工作。如果您僅依賴空白密碼並且未設置其他無密碼授權模式,則此功能無法使用。所以我設置了一個密碼。 –

相關問題