Redrock Postgres 搜索 英文
版本: 9.3 / 9.4 / 9.5 / 9.6 / 10 / 11 / 12 / 13 / 14 / 15 / 16 / 17

20.2. 用户名映射 #

在使用诸如 Ident 或 GSSAPI 等外部身份验证系统时,启动连接的操作系统用户的名字可能与要使用的数据库用户(角色)名字不同。在这种情况中,可应用用户名映射,将操作系统用户名映射到数据库用户。若要使用用户名映射,请在 pg_hba.conf 中的选项字段中指定 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,此文件中的行可以是包含指令,且遵循相同规则。

在启动时和主服务器进程收到 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 的身份登录。引用含有 \1database-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 网络上机器的人,如果其操作系统用户名不是 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