2025年9月25日: PostgreSQL 18 釋出!
支援版本:當前 (18) / 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.confmap-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 檔案的更改,或在檔案載入未達到預期效果時診斷問題。檢視中帶有非空 error 欄位的行表示檔案中相應行存在問題。

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

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

如果 system-username 欄位以斜槓 (/) 開頭,則該欄位的其餘部分被視為正則表示式。(有關 PostgreSQL 的正則表示式語法的詳細資訊,請參閱 第 9.7.3.1 節。)正則表示式可以包含單個捕獲或括號括起來的子表示式。然後可以在 database-username 欄位中引用與捕獲匹配的系統使用者名稱部分,形式為 \1(反斜槓-one)。這允許在單行中對映多個使用者名稱,這對於簡單的語法替換特別有用。例如,以下條目

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

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

如果 database-username 欄位以斜槓 (/) 開頭,則該欄位的其餘部分被視為正則表示式。當 database-username 欄位是正則表示式時,不能在其內部使用 \1 來引用 system-username 欄位的捕獲。

提示

請記住,預設情況下,正則表示式可以僅匹配字串的一部分。通常明智的做法是像上面示例中那樣使用 ^$,以強制匹配整個系統使用者名稱。

一個可以與 示例 20.1 中的 pg_hba.conf 檔案結合使用的 pg_ident.conf 檔案顯示在 示例 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

提交更正

如果您在文件中看到任何不正確的內容、與您對特定功能的體驗不符或需要進一步澄清的內容,請使用 此表單 來報告文件問題。