企业🤖AI智能体构建引擎,智能编排和调试,一键部署,支持私有化部署方案 广告
# 19.2\. 用户名映射 当使用像Ident 或 GSSAPI这样的外部认证系统时,发起连接的操作系统用户名可能与他需要连接的数据库用户是不同的。 在这种情况下,用户名映射可用于映射操作系统用户名到数据库用户。要使用用户名映射,在`pg_hba.conf` 中的选项中指定`map`=`_map-name_`。这个选项支持所有接受外部用户名的认证方法。 因为不同的映射可能需要不同的连接,使用的映射名在`pg_hba.conf`中的`_map-name_` 参数中指定,表示为每个独立的连接使用哪个映射。 用户名映射在身份映射文件中定义,缺省名为`pg_ident.conf` 并且缺省存储在集群的数据目录中。(不过,我们也可以把映射文件放在其它地方;参阅[ident_file](#calibre_link-1561)配置参数。) 身份映射文件包含的下面通用的格式: ``` _map-name_ _system-username_ _database-username_ ``` 注释和空白与`pg_hba.conf`文件里的一样处理。`_map-name_` 是将要用于在`pg_hba.conf`中引用这个映射的任意名称。 另外两个字段声明操作系统用户名和匹配的数据库用户名。同一个`_map-name_` 可以在一个映射中多次使用来声明多个用户映射。 对一个操作系统用户可以映射为多少个数据库用户没有限制,反之亦然。 对一个给定的操作系统用户可以映射为多少个数据库用户没有限制,反之亦然。 因此,映射中的记录应该被认为是意为"这个操作系统用户被允许作为这个数据库用户连接", 而不是意味着他们是相等的。如果有那对用户名的任意映射记录从带有那个用户请求连接的数据库用户名的外部认证系统获得, 那么这个连接将被允许。 如果`_system-username_`字段以一个反斜杠(`/`)开始, 那么该字段的剩余部分被作为一个规则表达式对待。(参阅[Section 9.7.3.1](#calibre_link-1037) 获取关于PostgreSQL规则表达式语法的细节。)规则表达式可以包含一个捕获, 或括号的子表达式,然后可以在`_database-username_`字段中作为`\1` (backslash-one)引用。 这允许多用户名的映射在一行中,这对于简单的语法替换特别有用。例如,这些记录: ``` mymap /^(.*)@mydomain\.com$ \1 mymap /^(.*)@otherdomain\.com$ guest ``` 将为带有系统用户名的以`@mydomain.com`结尾的用户删除域部分, 并且允许系统名以`@otherdomain.com`结尾的任意用户作为`guest`登录。 > **Tip:** 记住,缺省的,一个规则表达式只可以匹配字符串的一部分。使用`^`和`$`通常是明智的, 就像上面例子所示,来迫使匹配成为整个系统用户名。 在系统启动和主服务器收到一个SIGHUP 信号的时候会读取`pg_ident.conf`文件。如果你在一台活跃的系统上编辑该文件, 那么你需要给主服务器发信号(使用`pg_ctl reload`或`kill -HUP`)令其重新读取该文件。 [Example 19-2](#calibre_link-1562)里是一个可以和在[Example 19-1](#calibre_link-1560) 里面演示的`pg_hba.conf`文件配合使用的`pg_ident.conf`文件。 在这个例子的设置里,任何登录到 192.168 网络里的机器的用户,如果用户名不是`bryanh`, `ann`, `robert` 就不能获准访问。Unix 用户`robert`只有在试图以 PostgreSQL用户`bob`身份连接时才允许访问,而不能是`robert` 或其它什么身份。`ann`将只允许以`ann`的身份连接。用户`bryanh` 允许以他自己的`bryanh`身份或者作为`guest1`进行连接。 **Example 19-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 ```