當使用外部驗證系統(如 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
身份登入。 引用包含 \1
的 database-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 網路上且作業系統使用者名稱不是 bryanh
、ann
或 robert
的機器的人,將不會被授予存取權。Unix 使用者 robert
只有在嘗試以 PostgreSQL 使用者 bob
身分連線時,才被允許存取,而不是以 robert
或其他人的身分。 ann
只能以 ann
的身分連線。使用者 bryanh
將被允許以 bryanh
或 guest1
的身分連線。
範例 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
如果您在文件中發現任何不正確、與您使用特定功能的經驗不符或需要進一步澄清的地方,請使用此表格來報告文件問題。