在使用诸如 Ident 或 GSSAPI 等外部身份验证系统时,启动连接的操作系统用户的名字可能与要使用的数据库用户(角色)名字不同。在这种情况中,可应用用户名映射,将操作系统用户名映射到数据库用户。若要使用用户名映射,请在 pg_hba.conf
中的选项字段中指定 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
,此文件中的行可以是包含指令,且遵循相同规则。
在启动时和主服务器进程收到 SIGHUP 信号时,将读取 pg_ident.conf
文件。如果您在活动系统上编辑文件,则需要向主控进程发出信号(使用 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
(反斜杠一)。这允许在单行中映射多个用户名,这对于简单的语法替换尤其有用。例如,这些条目
mymap /^(.*)@mydomain\.com$ \1 mymap /^(.*)@otherdomain\.com$ guest
将为系统用户名以 @mydomain.com
结尾的用户删除域部分,并允许任何系统名称以 @otherdomain.com
结尾的用户以 guest
的身份登录。引用含有 \1
的 database-username
不会 让 \1
失去其特殊意义。
如果database-username
字段以斜杠 (/
) 开头,字段的剩余部分将被视为正则表达式(有关 PostgreSQL 的正则表达式语法的详细信息,请参见 第 9.7.3.1 节)。对于 database-username
的正则表达式,无法使用 \1
来使用 system-username
中的正则表达式捕获。
请记住,默认情况下,正则表达式可以匹配字符串的一部分。通常明智的做法是使用 ^
和 $
,如上例所示,以强制匹配整个系统用户名。
可以使用与 示例 20.1 中的 pg_hba.conf
文件结合使用的 pg_ident.conf
文件显示在 示例 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