PSQLException:伺服器請求基於密碼的身份驗證
一、簡介
使用 PostgreSQL 資料庫為 Spring Boot 專案設定資料來源時,一個常見的陷阱是為資料庫連線提供了錯誤的密碼,甚至忘記了所提供使用者的密碼。
這就是為什麼我們在啟動專案和連接資料庫時可能會遇到錯誤。在本教程中,我們將學習如何避免 PSQLException。
2. 資料來源配置
讓我們研究一下在 Spring Boot 中配置資料來源和資料庫連接的兩種最常見的技術。我們只能使用這兩種方法之一:檔案application.properties
或application.yml
.
2.1. application.properties
現在我們建立並配置application.properties
文件,其中包含連接所需的最少欄位:
spring.datasource.url=jdbc:postgresql://localhost:5432/tutorials
spring.datasource.username=postgres
spring.datasource.password=
spring.jpa.generate-ddl=true
應用程式透過新增屬性spring.jpa.generate-ddl
在啟動時建立表格。
我們不在文件內提供密碼,並嘗試從命令提示字元(在 Windows 上)啟動我們的應用程序,看看會發生什麼:
mvn spring-boot:run
我們注意到由於未提供身份驗證密碼而出現錯誤:
org.postgresql.util.PSQLException: The server requested password-based authentication, but no password was provided.
如果我們使用較新版本的 PostgreSQL 資料庫,此類訊息可能會稍微延遲,我們可能會看到SCRAM-based authentication
錯誤:
org.postgresql.util.PSQLException: The server requested SCRAM-based authentication, but no password was provided.
2.2. application.yml
在繼續之前,我們必須對文件application.properties
的內容進行註釋或從解決方案中刪除該文件,以便它不會與application.yml
文件衝突。
讓我們像之前所做的那樣,使用最少的必需欄位來建立和設定application.yml
檔案:
spring:
datasource:
url: jdbc:postgresql://localhost:5432/tutorials
username: postgres
password:
jpa:
generate-ddl: true
我們新增了屬性generate-ddl
來在啟動時建立表格。
透過**不填寫文件內的密碼並嘗試從命令提示字元啟動我們的應用程序,我們注意到與先前相同的錯誤**:
org.postgresql.util.PSQLException: The server requested password-based authentication, but no password was provided.
此外,如果我們使用較新的 PostgreSQL 資料庫,則在這種情況下,錯誤訊息可能會稍微延遲,顯示SCRAM-based authentication
錯誤。
2.3.提供密碼
在我們選擇使用的任一配置中,如果我們將密碼正確輸入到請求的參數中,伺服器將成功啟動。
否則,會顯示特定的錯誤訊息:
org.postgresql.util.PSQLException: FATAL: password authentication failed for user "postgres"
現在讓我們使用正確的密碼成功建立與資料庫的連接並且應用程式正確啟動:
2024-07-19T00:03:33.429+03:00 INFO 18708 --- [ restartedMain] com.baeldung.boot.Application : Started Application in 0.484 seconds
2024-07-19T00:03:33.179+03:00 INFO 18708 --- [ restartedMain] com.zaxxer.hikari.HikariDataSource : HikariPool-9 - Starting...
2024-07-19T00:03:33.246+03:00 INFO 18708 --- [ restartedMain] com.zaxxer.hikari.pool.HikariPool : HikariPool-9 - Added connection org.postgresql.jdbc.PgConnection@76116e4a
2024-07-19T00:03:33.247+03:00 INFO 18708 --- [ restartedMain] com.zaxxer.hikari.HikariDataSource : HikariPool-9 - Start completed.
3. 資料庫密碼重置
或者,如果我們忘記或選擇這樣做,我們可以選擇更改或重設資料庫使用者或預設使用者的密碼。
現在讓我們深入了解如何重設預設使用者postgres
的 PostgreSQL 密碼。
3.1.重置預設用戶的密碼
首先,我們確定 PostgreSQL 安裝的data
目錄的位置,如果在 Windows 上,最好在「 C:\Program Files\PostgreSQL\16\data
」內。
然後,讓我們透過將pg_hba.conf
檔案複製到其他位置或將其重命名為pg_hba.conf.backup
來備份它。在data
目錄中開啟命令提示字元並執行命令:
copy "pg_hba.conf" "pg_hba.conf.backup"
其次,編輯pg_dba.conf
檔案並將所有本地連接從scram-sha-256
更改為trust
,以便我們無需密碼即可登入 PostgreSQL 資料庫伺服器:
# TYPE DATABASE USER ADDRESS METHOD
# "local" is for Unix domain socket connections only
local all all trust
# IPv4 local connections:
host all all 127.0.0.1/32 trust
# IPv6 local connections:
host all all ::1/128 trust
# Allow replication connections from localhost, by a user with the
# replication privilege.
local replication all trust
host replication all 127.0.0.1/32 trust
host replication all ::1/128 trust
第三,使用服務功能重新啟動 PostgreSQL 伺服器(在 Windows 上)。或者,我們可以在命令提示字元中以管理員身分執行以下命令:
pg_ctl -D "C:\Program Files\PostgreSQL\16\data" restart
之後,我們使用psql
或pgAdmin
等工具連接到 PostgreSQL 資料庫伺服器。
在 PostgreSQL 安裝資料夾下的bin
目錄中開啟命令提示符,然後鍵入以下psql
命令:
psql -U postgres
我們已經登入資料庫,因為 PostgreSQL 不需要密碼。讓我們透過執行以下命令來更改使用者postgres
的密碼:
ALTER USER postgres WITH PASSWORD 'new_password';
最後,讓我們像以前一樣恢復pg_dba.conf
檔案並restart
PostgreSQL 資料庫伺服器。現在,我們可以使用設定檔中的新密碼連接到 PostgreSQL 資料庫。
3.2.為任何其他使用者重置密碼
透過選擇使用psql
(在 Windows 上)執行此操作,我們在 PostgreSQL 安裝bin目錄中開啟命令提示字元並執行命令:
psql -U postgres
然後我們提供postgres
用戶的密碼並登入。
以超級用戶postgres
登入後,讓我們更改我們想要的用戶的密碼:
ALTER USER user_name WITH PASSWORD 'new_password';
4。
在本文中,我們了解了在 Spring Boot 應用程式中配置資料來源時的常見連線問題以及解決該問題的各種選項。
與往常一樣,範例程式碼可以在 GitHub 上找到。