当使用外部认证系统(如 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
文件。如果您在活动系统上编辑该文件,则需要向 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
(反斜杠-一)。这允许在一个行中映射多个用户名,这对于简单的语法替换特别有用。例如,这些条目
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
上的正则表达式操作。
请记住,默认情况下,正则表达式可以匹配字符串的一部分。通常最好使用 ^
和 $
,如上面的示例所示,以强制匹配整个系统用户名。
可以在 示例 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
如果您在文档中发现任何不正确的内容,与您对特定功能的体验不符或需要进一步说明,请使用 此表格 报告文档问题。