在使用诸如 Ident 或 GSSAPI 等外部身份验证系统时,发起连接的操作系统用户名可能与要使用的数据库用户(角色)不同。在这种情况下,可以应用用户名映射将操作系统用户名映射到数据库用户。要使用用户名映射,请在 pg_hba.conf 中的选项字段中指定 map=map-name。此选项受支持于所有接收外部用户名的身份验证方法。由于不同的连接可能需要不同的映射,因此在 pg_hba.conf 中的 map-name 参数中指定要使用的映射的名称,以指示对每个单独连接使用哪个映射。
用户名映射在 ident 映射文件中定义,默认情况下该文件名为 pg_ident.conf,并存储在集群的数据目录中。(但是,可以将映射文件放置在其他位置;请参见 ident_file 配置参数。)ident 映射文件包含以下一般形式的行
map-namesystem-usernamedatabase-usernameincludefileinclude_if_existsfileinclude_dirdirectory
注释、空白和行续行与 pg_hba.conf 中的处理方式相同。 map-name 是一个任意名称,将在 pg_hba.conf 中用于引用此映射。其他两个字段指定操作系统用户名和匹配的数据库用户名。同一个 map-name 可以重复使用,以便在单个映射中指定多个用户映射。
对于 pg_hba.conf,此文件中的行可以是包含指令,遵循相同的规则。
对于给定的操作系统用户可以对应多少个数据库用户,反之亦然,没有限制。因此,映射中的条目应被视为表示 “此操作系统用户允许连接为此数据库用户”,而不是暗示它们是等效的。如果存在将从外部身份验证系统获取的用户名与用户请求连接的数据库用户名配对的任何映射条目,则将允许连接。值 all 可用作 database-username,以指定如果 system-user 匹配,则此用户允许登录为任何现有数据库用户。引用 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 在 database-username 的正则表达式中使用 system-username 的正则表达式的捕获。
请记住,默认情况下,正则表达式只能匹配字符串的一部分。通常,明智的做法是使用 ^ 和 $,如上例所示,以强制匹配整个系统用户名。
在启动时和主服务器进程接收到 SIGHUP 信号时,会读取 pg_ident.conf 文件。如果您在活动系统上编辑文件,则需要向 postmaster 发出信号(使用 pg_ctl reload,调用 SQL 函数 pg_reload_conf(),或使用 kill -HUP)以使其重新读取文件。
系统视图 pg_ident_file_mappings 有助于预先测试对 pg_ident.conf 文件的更改,或在加载文件未达到预期效果时诊断问题。视图中具有非空 error 字段的行表示文件中相应行中的问题。
在 示例 21.1 中显示的 pg_ident.conf 文件可与 pg_hba.conf 文件结合使用,示例 21.2 中显示了此类文件。在此示例中,登录到 192.168 网络上的计算机且没有操作系统用户名 bryanh、ann 或 robert 的任何人都将无法获得访问权限。只有当 Unix 用户 robert 尝试以 PostgreSQL 用户 bob(而非 robert 或其他任何人)的身份进行连接时,才会被允许访问。ann 只能以 ann 的身份进行连接。用户 bryanh 可以以 bryanh 或 guest1 的身份进行连接。
示例 21.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
如果您在文档中看到任何不正确、与您对特定功能的体验不符或需要进一步澄清的内容,请使用 此表单 报告文档问题。