Centos下本地连接postgresql时出现认证错误的问题
出現這個問題,主要原因在于postgresql的配置的認證權限不對。
postgresql的配置權限的文件在
/var/lib/pgsql/data/pg_hba.conf
里面主要是關于認證權限的配置
PostgreSQL 支持下面這些身份驗證方式:
我們先詳細講解一下 PostgreSQL 中四種最常見的身份驗證方式。
trust 身份驗證
當使用 trust 身份驗證方式時, PostgreSQL 會認為凡是能連接到該數據庫服務器的,都是可信任的,可以隨意訪問數據庫,而不管他們用什么數據庫用戶名來訪問。這里邊包含了如下幾個意思:
- trust 方式需要你提供正確的數據庫用戶名,但是不需要提供密碼。用不存在的數據庫用戶名來登錄,那是不行的。
- 數據庫用戶名可以沒有對應的操作系統用戶名(通常來說同名)。
- 對于本地連接(Unix domain socket)來說,該方式實際上是把身份驗證的職責全權交給了操作系統,只要取得了操作系統的訪問權就取得了 PostgreSQL 的訪問權。
- 如果在TCP/IP連接上使用 trust 身份驗證方式,那就等價于沒有身份驗證了。
基于密碼的身份驗證
基于密碼的身份驗證方式包括 md5 和 password。這兩種方式非常相似,唯一的區別在于傳輸密碼的時候前者是md5加密的,后者是明文的。同樣的:
- 既需要提供正確的數據庫用戶名,也需要提供密碼。需要特別注意的是,采用md5方式的時候,并不需要你提供md5加密的密碼,直接輸入明文密碼即可。psql, pgadmin, jdbc 會自動進行md5加密的。
- 數據庫用戶名可以沒有對應的操作系統用戶名(通常來說同名)。
- 對于本地連接(Unix domain socket)來說,該方式既需要你獲取操作系統訪問權,還需要你提供數據庫用戶密碼來獲取 PostgreSQL 的訪問權。
- 如果在TCP/IP連接上使用基于密碼的身份驗證方式,身份驗證是基于密碼的。
ident 身份驗證
ident 方式通過 Identification 協議,從 ident 服務器獲得客戶端操作系統用戶名,然后把操作系統用戶名作為數據庫用戶名。該方式只能用于TCP/IP連接。當 ident 被用于本地(非TCP/IP)鏈接時, 實際上采用的是 peer 方式。
RFC 1413 文檔描述了 Identification 協議。幾乎所有的Unix類操作系統都提供了 ident 服務器(openSUSE可以安裝 oidentd或者 pidentd),這些 ident 服務器默認監聽 TCP 113 端口。ident 服務器的基本功能就是回答類似“哪個用戶建立了從你的X端口出來然后連入我的Y端口的連接?”的問題。由于 PostgreSQL 知道物理鏈接的 X 端口和 Y端口,它就可以詢問鏈接客戶端所在主機上的 ident 服務器,從而可以知道這條鏈接是哪個操作系統用戶建立的。
這個流程的缺點是它依賴于客戶端的完整性:如果客戶端機器不可信,攻擊者可以在113端口運行任意程序并返回任意用戶名。因而這種身份驗證方式只適合于封閉網絡,而且該網絡中的所有客戶端機器都必須嚴格控制,數據庫管理員和系統管理員必須緊密聯系。換句話說,你必須信任運行 ident 服務器的機器。同時你還必須注意,RFC 1413協議明確說明了,Identification 協議的設計意圖并不是為了身份驗證和訪問控制。
一些 ident 服務器提供了非標準選項,會導致返回加密了的用戶名,而加密時使用的密鑰只有 ident 服務器的管理員知道。這些 ident 服務器要和 PostgreSQL 協同工作,一定不能使用這些選項,因為 PostgreSQL 無法解密返回的字符串,無從知道真實用戶名。
同樣的:
- 需要提供正確的數據庫用戶名,不需要提供密碼。且該數據庫用戶名必須和建立數據庫鏈接的操作系統用戶名一致,通常來說就是啟動客戶端應用的操作系統用戶名。
- 數據庫用戶名必須有對應的操作系統用戶名(通常來說同名)。
- 不能應用在本地連接上。
- 如果在TCP/IP連接上使用該驗證方式,相當于身份驗證完全交給了數據庫客戶端應用所在的機器。和 trust 方式一樣,極其不安全。
peer 身份驗證
peer 身份驗證方式通過客戶端操作系統內核來獲取用戶名,并作為數據庫用戶名來進行登錄。該方式只能應用在本地連接上。peer 身份驗證方式只能在那些提供了getpeereid()函數,SO_PEERCRED socket參數或者類似機制的操作系統中使用。當前包括 Linux,大多數 BSD系統比如 Mac OS X 和 Solaris。
- 需要提供正確的數據庫用戶名,不需要提供密碼。且該數據庫用戶名必須和啟動客戶端應用的操作系統用戶名一致,比如使用 bruce 用戶啟動了 pgadmin, 那么在連接數據庫時就必須提供 bruce 用這個數據庫用戶名。
- 數據庫用戶名必須有對應的操作系統用戶名(通常來說同名)。
- 如果在本地連接上使用該驗證方式,相當于身份驗證完全交給了數據庫客戶端應用所在的機器。和 trust 方式一樣,極其不安全。
- 不能應用在 TCP/IP 鏈接上。
在Centos中安裝的postgresql,默認的本地認證方式是ident,也就是peer。數據庫的用戶名必須有對應的操作系統用戶名,因此如果一個叫Jedi的操作系統用戶,要以postgres用戶身份登錄,就會出現“認證錯誤”。大家可以把認證方式改為trust或者password,就可以了。
再多說一句,操作系統的用戶與postgresql中的用戶是兩碼事,可以有不同的密碼。如果是用的password的認證方式,那么你用postgres登錄操作系統后,還需要再次輸入postgresql的密碼,才能進入數據庫。
總結
以上是生活随笔為你收集整理的Centos下本地连接postgresql时出现认证错误的问题的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 利用牛顿法接非线性方程组的Matlab程
- 下一篇: 利用python下载网页到本地(pyth