支援的版本:目前 (17) / 16 / 15 / 14 / 13
開發版本:devel
不支援的版本:12 / 11 / 10 / 9.6 / 9.5 / 9.4 / 9.3 / 9.2 / 9.1 / 9.0 / 8.4

20.2. 使用者名稱對應 #

當使用外部驗證系統(如 Ident 或 GSSAPI)時,啟動連線的作業系統使用者名稱可能與要使用的資料庫使用者(角色)名稱不同。 在這種情況下,可以應用使用者名稱對應來將作業系統使用者名稱對應到資料庫使用者。 要使用使用者名稱對應,請在 pg_hba.conf 中的 options 欄位中指定 map=map-name。 此選項適用於所有接收外部使用者名稱的驗證方法。 由於不同的連線可能需要不同的對應,因此要在 pg_hba.conf 中的 map-name 參數中指定要使用的對應名稱,以表明每個單獨連線使用哪個對應。

使用者名稱對應定義在 ident 對應檔案中,預設情況下該檔案名為 pg_ident.conf,並儲存在叢集的資料目錄中。 (但是,可以將對應檔案放置在其他位置;請參閱 ident_file 組態參數。)ident 對應檔案包含以下一般形式的行

map-name system-username database-username
include file
include_if_exists file
include_dir directory

註解、空白和換行符的處理方式與 pg_hba.conf 中的處理方式相同。map-name 是一個任意名稱,用於在 pg_hba.conf 中引用此對應。 其他兩個欄位指定作業系統使用者名稱和相符的資料庫使用者名稱。 同一個 map-name 可以重複使用,以在單個對應中指定多個使用者對應。

對於 pg_hba.conf,此檔案中的行可以是 include 指令,遵循相同的規則。

pg_ident.conf 檔案會在啟動時以及主伺服器程序收到 SIGHUP 信號時讀取。 如果您在活動系統上編輯該檔案,則需要向 postmaster 發出信號(使用 pg_ctl reload、呼叫 SQL 函數 pg_reload_conf() 或使用 kill -HUP)以使其重新讀取該檔案。

系統檢視 pg_ident_file_mappings 對於預先測試對 pg_ident.conf 檔案的變更,或在檔案載入未產生預期效果時診斷問題非常有用。 檢視中具有非 null error 欄位的列表示檔案中相應的行存在問題。

對於給定的作業系統使用者可以對應到多少個資料庫使用者,或者反之亦然,沒有任何限制。 因此,對應中的條目應被認為意味著此作業系統使用者可以以這個資料庫使用者的身份連線,而不是暗示它們是等效的。 如果有任何對應條目將從外部驗證系統獲得的使用者名稱與使用者已請求以之連線的資料庫使用者名稱配對,則將允許連線。 值 all 可用作 database-username,以指定如果 system-username 匹配,則允許此使用者以任何現有資料庫使用者的身份登入。 引用 all 會使關鍵字失去其特殊含義。

如果 database-username+ 字元開頭,則作業系統使用者可以登入為屬於該角色的任何使用者,類似於 pg_hba.conf 中以 + 開頭的使用者名稱的處理方式。 因此,+ 標記表示匹配直接或間接屬於此角色的任何角色,而沒有 + 標記的名稱僅匹配該特定角色。 引用以 + 開頭的使用者名稱會使 + 失去其特殊含義。

如果 system-username 欄位以斜線 (/) 開頭,則欄位的其餘部分將被視為正則表達式。 (有關 PostgreSQL 的正則表達式語法的詳細信息,請參閱 第 9.7.3.1 節。)正則表達式可以包含單個捕獲或括號中的子表達式,然後可以在 database-username 欄位中將其引用為 \1(反斜線-1)。 這允許在單行中對應多個使用者名稱,這對於簡單的語法替換特別有用。 例如,這些條目

mymap   /^(.*)@mydomain\.com$      \1
mymap   /^(.*)@otherdomain\.com$   guest

將刪除系統使用者名稱以 @mydomain.com 結尾的網域部分,並允許任何系統名稱以 @otherdomain.com 結尾的使用者以 guest 身份登入。 引用包含 \1database-username不會使 \1 失去其特殊含義。

如果 database-username 欄位以斜線 (/) 開頭,則欄位的其餘部分將被視為正則表達式(有關 PostgreSQL 的正則表達式語法的詳細信息,請參閱 第 9.7.3.1 節)。 無法使用 \1 來使用來自 system-username 上正則表達式的捕獲來處理 database-username 上的正則表達式。

提示

請記住,預設情況下,正規表示式只能匹配字串的一部分。通常最好使用 ^$,如上面的範例所示,以強制匹配整個系統使用者名稱。

一個 pg_ident.conf 檔案,可以與 pg_hba.conf 檔案結合使用,如範例 20.1所示。在範例 20.2中,任何登入到 192.168 網路上且作業系統使用者名稱不是 bryanhannrobert 的機器的人,將不會被授予存取權。Unix 使用者 robert 只有在嘗試以 PostgreSQL 使用者 bob 身分連線時,才被允許存取,而不是以 robert 或其他人的身分。 ann 只能以 ann 的身分連線。使用者 bryanh 將被允許以 bryanhguest1 的身分連線。

範例 20.2. pg_ident.conf 檔案的範例

# MAPNAME       SYSTEM-USERNAME         PG-USERNAME

omicron         bryanh                  bryanh
omicron         ann                     ann
# bob has user name robert on these machines
omicron         robert                  bob
# bryanh can also connect as guest1
omicron         bryanh                  guest1

提交更正

如果您在文件中發現任何不正確、與您使用特定功能的經驗不符或需要進一步澄清的地方,請使用此表格來報告文件問題。