PostgeSQL 的代理身份驗證
以下似乎是一個相當普遍的情況,但我還沒有看到任何解決方案。
我有一個 PostgreSQL 數據庫,其中包含特定於 的視圖,
$user
以便根據某些特定於數據庫的 ACL 邏輯來限制數據。數據庫通常通過 JDBC 訪問,特別是在 JSP 中用於 Web 界面。使用者使用 LDAP 使用密碼驗證登錄網站。我想要的是利用從 JDBC 連接到數據庫的視圖。但通常這種中間層連接是使用通用使用者創建的,而不是特定於登錄網站的人。我相信在 Oracle 中,“正確”的方法是Proxy Authentication,但 AFAIAA 沒有 PostgreSQL 的等價物。那麼該怎麼做呢?
一些想法浮現在腦海:
- 為所有使用者的數據庫帳戶提供相同的密碼,然後使用此通用密碼創建使用者特定的 JDBC 連接(這感覺太不對勁了……)
- 將使用者的登錄密碼儲存在網站的某處,以便在創建數據庫連接時重複使用(再次,這感覺非常錯誤)
還有其他(希望是更好的)建議嗎?
通常的解決方案是在 Web 應用程序中對使用者進行身份驗證,然後在已使用固定使用者名通過數據庫進行身份驗證的 JDBC 會話上發出
SET ROLE
或SET SESSION AUTHORIZATION
“成為”使用者。在這兩種情況下
DISCARD ALL
,任何連接池在將連接返回到池時都應執行的命令將自動重置授權。確保您的連接池DISCARD ALL
在返回的連接上執行。這些很像連結的 Oracle 文件中給出的三個“代理身份驗證”案例中的第一個。
PostgreSQL 不支持其他兩種形式,其中客戶端身份驗證被傳遞到數據庫。支持相對簡單,但沒有人想要它來實施它或資助其他人實施它所需的工作。
SET ROLE
要使用
SET ROLE
,您必須以具有所有使用者角色成員身份的使用者身份連接到數據庫,但該使用者可以是非特權使用者。DB 使用者應該在時間NOINHERIT
設置ALTER ROLE
或設置選項CREATE ROLE
。因此,您通常將 webapp 使用者創建為 webapp 使用者所屬的 db 角色,例如CREATE ROLE newusername NOLOGIN ROLE mywebappuser;
(
ROLE mywebapp
相當於執行後續GRANT newusername TO mywebappuser;
)。
SET SESSION AUTHORIZATION
要使用
SET SESSION AUTHORIZATION
,您必須以超級使用者身份連接,這通常是不可取的,因為它將完全控制權交給了 webapp 使用者。不像
SET ROLE
對組成員身份沒有要求。