受支持版本: 当前版本 (18) / 17 / 16 / 15 / 14
开发版本: devel

20.2. 用户名映射 #

当使用 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 一样,此文件中的各行也可以是 include 指令,并遵循相同的规则。

对于给定的一个操作系统用户可以对应多少个数据库用户,没有任何限制,反之亦然。因此,映射中的条目应理解为该操作系统用户被允许以该数据库用户身份连接,而不是意味着两者等价。只要存在任何一条映射项把外部认证系统获得的用户名与用户请求连接时使用的数据库用户名配对起来,该连接就会被允许。值 all 还可以用作 database-username,表示只要 system-username 匹配,该用户就被允许以任意现有数据库用户身份登录。若给 all 加上引号,则它会失去该特殊含义。

如果 database-username 字段以 + 开头,则该操作系统用户可以以属于该角色的任意用户身份登录,这与 pg_hba.conf 中以 + 开头的用户名处理方式类似。因此,+ 标记表示匹配直接或间接属于该角色的任意角色,而没有 + 标记的名称只匹配该特定角色。对以 + 开头的用户名加上引号,会让 + 失去其特殊含义。

如果 system-username 字段以斜线(/)开头,则该字段的其余部分会被视为一个正则表达式。(关于 PostgreSQL 正则表达式语法的细节,见 Section 9.7.3.1。)该正则表达式可以包含一个捕获组,也就是用圆括号括起来的子表达式;捕获到的系统用户名片段随后可以在 database-username 字段中通过 \1(反斜线一)引用。这使得在一行中映射多个用户名成为可能,特别适合简单的语法替换。例如,下面这些条目

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

会去掉系统用户名中以 @mydomain.com 结尾的域名部分,并允许任何系统名以 @otherdomain.com 结尾的用户以 guest 身份登录。对包含 \1database-username 加上引号,并不会\1 失去其特殊含义。

如果 database-username 字段以斜线(/)开头,则该字段其余部分会被视为一个正则表达式。当 database-username 字段是正则表达式时,不能在其中使用 \1 来引用 system-username 字段中的捕获组。

Tip

记住在默认情况下,一个正则表达式可以只匹配字符串的一部分。如上例所示,使用^$来强制匹配整个系统用户名通常是明智的。

在启动时以及主服务器进程收到 SIGHUP 信号时,pg_ident.conf 文件会被读取。 如果你在运行中的系统上编辑了该文件,就需要通知 postmaster(使用 pg_ctl reload、调用 SQL 函数 pg_reload_conf(),或者使用 kill -HUP)重新读取该文件。

Example 20.2 展示了一个可与 Example 20.1 中的 pg_hba.conf 文件配合使用的 pg_ident.conf 文件。在这个示例中,任何登录到 192.168 网络中某台机器上的用户,如果其操作系统用户名不是 bryanhannrobert,都不会被授予访问权限。Unix 用户 robert 只有在尝试以 PostgreSQL 用户 bob 身份连接时才被允许访问,而不能以 robert 或其他身份连接。ann 只能以 ann 身份连接。用户 bryanh 则可以以 bryanhguest1 身份连接。

Example 20.2. 示例 pg_ident.conf 文件

# MAPNAME       SYSTEM-USERNAME         PG-USERNAME

omicron         bryanh                  bryanh
omicron         ann                     ann
# bob 在这些机器上有用户名 robert
omicron         robert                  bob
# bryanh 也可以作为 guest1 连接
omicron         bryanh                  guest1

提交更正

如果您发现文档中有不正确的内容、与您使用特定功能的经验不符或需要进一步说明,请使用此表单来报告文档问题。