19.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

以在pg_hba.conf中同样的方式处理注释和空白。map-name是一个任意名称,习惯在pg_hba.conf中提及这种映射。其他两个字段指定操作系统的用户名和匹配数据库的用户名。相同的map-name可以在单一映射中反复使用指定多个用户映射。

关于多少数据库用户和给定的 操作系统的用户对应,这些没有限制,反之亦然。 因此,记录映射应该看作意味着"这个操作系统允许连接该数据库的用户",而不是意味着他们等价。如果有任何映射条目,从外部认证系统获得的用户名与已要求用户连接的数据库用户名搭配,连接将被允许。

如果system-username字段开始用斜线(/), 字段其余部分将被视为一个正则表达式。(参阅Section 9.7.3.1PostgreSQL正则表达式语法的详细描述。)正则表达式可以包括一个单一的捕获,或带括号的子表达式,然后可参考database-username 作为\1(反斜杠一)。这允许单行多用户名映射特别有用于简单的语法替换。 例如,这些条目

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

将删除以@mydomain.com结束的系统用户名使用者,以及 允许以@otherdomain.com结束以guest登录的任何系统名称用户的部分字段。

Tip: 请记住,默认情况下,一个正则表达式可以匹配部分字符串。 使用^ and $通常是明智的, 正如上面的例子所示,迫使匹配整个系统的用户名。

当主服务器进程接收一个SIGHUP 信号,pg_ident.conf文件读取启动。 如果您在主系统编辑文件,您将需要传达到邮局(使用pg_ctl reload或者kill -HUP),使重新读取该文件。

pg_ident.conf文件结合pg_hba.conf文件中使用。 Example 19-1显示在Example 19-2中。 在这个例子中,任何人都可以登录到192.168网络的一台机器上, 没有操作系统用户名bryanh, ann或者 robert不会被授予访问权限。 当他设法连接PostgreSQL用户bob 而不是robert或者其他任何人时,Unix用户robert将只被允许访问。 ann只允许连接ann。用户bryanh允许连接bryanh或者guest1

Example 19-2. An example pg_ident.conf file 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