1. 簡介
當配置我們的 Spring Boot 項目中使用 PostgreSQL 數據庫的數據源時,一個常見的陷阱是提供錯誤的數據庫連接密碼,甚至忘記提供用户密碼。
這可能導致我們在啓動項目並連接到數據庫時遇到錯誤。在本教程中,我們將學習如何避免 PSQLException 錯誤。
2. 數據源配置
讓我們研究兩種最常見的配置數據源和數據庫連接在 Spring Boot 中的技術,即使用 application.properties 文件或 application.yml 文件。只能使用其中一種方法。
2.1. application.properties</h3
現在,我們創建並配置 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 認證 的錯誤:
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<p>我們已添加了 <em >generate-ddl</em> 屬性,用於在啓動時創建表。</p>
<p><strong >通過</strong><strong >未在文件中完成密碼並嘗試從命令提示符啓動我們的應用程序,我們注意到之前遇到的相同錯誤:</p>
org.postgresql.util.PSQLException: The server requested password-based authentication, but no password was provided.此外,在這種情況下,錯誤信息可能會略有不同,顯示 基於 SCRAM 的身份驗證 錯誤,如果我們在使用較新的 PostgreSQL 數據庫時。
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.backup,備份 pg_hba.conf 文件。 在 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首先,使用 Windows 上的“服務”功能重啓 PostgreSQL 服務器。 另一種方法是在命令提示符中以管理員身份運行以下命令:
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文件並重啓 PostgreSQL 數據庫服務器。現在,我們可以使用配置文件的新密碼連接到 PostgreSQL 數據庫。
3.2. 為任何其他用户重置密碼
通過使用 psql (在 Windows 上),我們會在 PostgreSQL 安裝的 bin 目錄下的命令提示符中打開一個命令行,並執行以下命令:
psql -U postgres我們隨後提供 postgres 用户的密碼以及登錄權限。
作為超級用户 postgres 登錄後,請更改您想要更改密碼的用户密碼:
ALTER USER user_name WITH PASSWORD 'new_password';4. 結論
在本文中,我們探討了在 Spring Boot 應用程序中配置數據源時常見的連接問題,以及解決該問題的方法。