IdentやGSSAPIといった外部の認証システムを使用する場合は、接続を開始したオペレーティングシステムのユーザ名がデータベースユーザ名と同じであるとは限りません。 ユーザ名マップを使用するには、pg_hba.conf内でmap=map-nameオプションを指定してください。 このオプションは、外部ユーザ名を受け取るすべての認証方式をサポートしています。 異なる接続に対して、異なるマップが必要となる可能性があります。そのため、それぞれの接続に対して使用されるマップを指定するために、使用するマップの名称は pg_hba.conf内のmap-nameパラメータで指定されます。
Identマップはidentマップファイルに定義されています。デフォルトではファイル名はpg_ident.confで クラスタのデータディレクトリに保存されています。(他の場所にも保存できますが、詳細はident_file設定パラメータを参照してください。) identマップファイルは一般的な形式の行を含んでいます。
map-name system-username database-username
コメントと空白はpg_hba.confと同様に扱われます。 map-nameは pg_hba.conf内で参照される任意の名称です。 他の2つのフィールドは、どのオペレーティングシステムユーザが、どのデータベースユーザに接続することを許可されているかを指定しています。 同じmap-nameは、1つのマップ内でユーザをマップするために繰り返し使用されます。
どれだけのデータベースユーザがオペレーティングシステムのユーザに対して一致しているか、またその逆に対しても制限はありません。 よってマップ内のエントリは、それらが等しいというよりもむしろ "このオペレーティングシステムのユーザはこのデータベースユーザとして接続する"という意味になります。 もし外部の認証システムから得られたユーザ名と接続要求を行ったデータベースユーザ名が一致するエントリがマップ内にある場合は、接続は許可されます。
もしsystem-usernameフィールドがスラッシュ(/)で始まっている場合は、 このフィールドの残りは正規表現として扱われます。 (PostgreSQLの正規表現構文の詳細については項9.7.3.1を参照してください。 ユーザ名マップ内の正規表現は常に"advanced"として扱われます。) 正規表現は単一検索や括弧を使用した表現、database-usernameフィールドで\1(バックスラッシュ)で参照されるような表現を含みます。 これにより、1行で複数のユーザ名のマップが可能となり、簡単な構文で特に使いやすくなります。例を以下に示します。
mymap /^(.*)@mydomain\.com$ \1 mymap /^(.*)@otherdomain\.com$ guest
上記のエントリでは、@mydomain.comで終わるシステムユーザ名のドメイン部分を削除して、 @otherdomain.comで終わるシステムユーザ名がguestとしてログインすることを許可します。
ティップ: デフォルトでは正規表現は、文字列の一部を一致させることに注意してください。 上記の例で示したように、システムユーザ名全体を強制的に一致させるために^や$を使用すると有用です。
pg_ident.confファイルは起動時と、メインサーバのプロセスが SIGHUPを受信したときに読み込まれます。 起動しているシステムで編集した場合は、ファイルを再読み込みするために(pg_ctl reloadまたはkill -HUPを使用して) サーバにシグナルを送信する必要があります。
pg_ident.confファイルは、pg_hba.confファイルと結合して使用されます。 例19-2に例19-1の例があります。 この例では、192.168のネットワーク内のマシンにログインしている、 Unixユーザ名でbryanh、ann、robert以外の誰もが、アクセスを許可されていません。 UnixユーザrobertはPostgreSQLユーザであるbobとして接続しようとした時のみ アクセス可能で、 robertや他の名前ではアクセスできません。 annはannとして接続した時のみ許可され、bryanhはbryanh自身もしくはguest1として アクセスが可能となります。