Postgresql

PostgeSQL 的代理身份驗證

  • October 6, 2014

以下似乎是一個相當普遍的情況,但我還沒有看到任何解決方案。

我有一個 PostgreSQL 數據庫,其中包含特定於 的視圖,$user以便根據某些特定於數據庫的 ACL 邏輯來限制數據。數據庫通常通過 JDBC 訪問,特別是在 JSP 中用於 Web 界面。使用者使用 LDAP 使用密碼驗證登錄網站。

我想要的是利用從 JDBC 連接到數據庫的視圖。但通常這種中間層連接是使用通用使用者創建的,而不是特定於登錄網站的人。我相信在 Oracle 中,“正確”的方法是Proxy Authentication,但 AFAIAA 沒有 PostgreSQL 的等價物。那麼該怎麼做呢?

一些想法浮現在腦海:

  • 為所有使用者的數據庫帳戶提供相同的密碼,然後使用此通用密碼創建使用者特定的 JDBC 連接(這感覺太不對勁了……)
  • 將使用者的登錄密碼儲存在網站的某處,以便在創建數據庫連接時重複使用(再次,這感覺非常錯誤)

還有其他(希望是更好的)建議嗎?

通常的解決方案是在 Web 應用程序中對使用者進行身份驗證,然後在已使用固定使用者名通過數據庫進行身份驗證的 JDBC 會話上發出SET ROLESET 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對組成員身份沒有要求。

引用自:https://dba.stackexchange.com/questions/77704