2025年9月25日: PostgreSQL 18 发布!
支持版本:当前 (18) / 17 / 16 / 15 / 14 / 13
开发版本:devel
不支持的版本: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=map-name。此选项支持所有接收外部用户名的认证方法。由于不同的连接可能需要不同的映射,因此映射的名称在 pg_hba.confmap-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 指令,遵循相同的规则。

pg_ident.conf 文件在启动时以及主服务器进程收到 SIGHUP 信号时被读取。如果您在活动系统上编辑了该文件,则需要通知 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(反斜杠-one)。这允许在单行中映射多个用户名,这对于简单的语法替换特别有用。例如,以下条目

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

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

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

提示

请记住,默认情况下,正则表达式可以仅匹配字符串的一部分。通常明智的做法是像上面示例中那样使用 ^$,以强制匹配整个系统用户名。

一个可以与 示例 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

提交更正

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