支持的版本:当前 (17) / 16 / 15 / 14 / 13
开发版本:开发版
不支持的版本: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=映射名称。此选项支持所有接收外部用户名的认证方法。由于不同的连接可能需要不同的映射,因此在 pg_hba.conf 中的 映射名称 参数中指定要使用的映射名称,以指示每个单独的连接要使用哪个映射。

用户名映射在 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 中相同。映射名称 是一个任意名称,用于在 pg_hba.conf 中引用此映射。其他两个字段指定一个操作系统用户名和一个匹配的数据库用户名。可以重复使用同一个 映射名称,以在一个映射中指定多个用户映射。

对于 pg_hba.conf,此文件中的行可以包含 include 指令,遵循相同的规则。

在启动时以及主服务器进程收到 SIGHUP 信号时,会读取 pg_ident.conf 文件。如果您在活动的系统上编辑该文件,则需要向 postmaster 发出信号(使用 pg_ctl reload、调用 SQL 函数 pg_reload_conf() 或使用 kill -HUP)以使其重新读取该文件。

系统视图 pg_ident_file_mappings 对于预测试对 pg_ident.conf 文件的更改,或者如果文件的加载没有达到预期的效果,则用于诊断问题非常有用。视图中具有非空 error 字段的行表示文件中相应行的问题。

对于给定的操作系统用户可以对应多少个数据库用户,反之亦然,没有限制。因此,映射中的条目应被视为表示此操作系统用户允许以此数据库用户身份连接,而不是暗示它们是等效的。如果存在任何将从外部认证系统获得的用户名称与用户请求连接的数据库用户名配对的映射条目,则允许连接。值 all 可以用作 数据库用户名,以指定如果 系统用户名 匹配,则允许此用户以任何现有数据库用户身份登录。引用 all 会使关键字失去其特殊含义。

如果 数据库用户名+ 字符开头,则操作系统用户可以登录为属于该角色的任何用户,类似于在 pg_hba.conf 中如何处理以 + 开头的用户名。因此,+ 标记表示匹配直接或间接属于此角色的任何角色,而没有 + 标记的名称仅匹配该特定角色。引用以 + 开头的用户名会使 + 失去其特殊含义。

如果 系统用户名 字段以斜杠 (/) 开头,则该字段的其余部分将视为正则表达式。(有关 PostgreSQL 的正则表达式语法的详细信息,请参见第 9.7.3.1 节。)正则表达式可以包括单个捕获或带括号的子表达式,然后可以在 数据库用户名 字段中将其引用为 \1(反斜杠一)。这允许在一行中映射多个用户名,这对于简单的语法替换特别有用。例如,以下条目

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

将删除系统用户名以 @mydomain.com 结尾的用户的域部分,并允许任何系统名称以 @otherdomain.com 结尾的用户以 guest 身份登录。引用包含 \1数据库用户名 不会 使 \1 失去其特殊含义。

如果 数据库用户名 字段以斜杠 (/) 开头,则该字段的其余部分将视为正则表达式(有关 PostgreSQL 的正则表达式语法的详细信息,请参见第 9.7.3.1 节)。无法使用 \1 来使用 系统用户名 上正则表达式的捕获,以用于 数据库用户名 上的正则表达式。

提示

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

示例 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

提交更正

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