19.2. 用户名映射

当使用像Ident 或 GSSAPI这样的外部认证系统时,发起连接的操作系统用户名可能与他需要连接的数据库用户是不同的。 在这种情况下,用户名映射可用于映射操作系统用户名到数据库用户。要使用用户名映射,在pg_hba.conf 中的选项中指定map=map-name。这个选项支持所有接受外部用户名的认证方法。 因为不同的映射可能需要不同的连接,使用的映射名在pg_hba.conf中的map-name 参数中指定,表示为每个独立的连接使用哪个映射。

用户名映射在身份映射文件中定义,缺省名为pg_ident.conf 并且缺省存储在集群的数据目录中。(不过,我们也可以把映射文件放在其它地方;参阅ident_file配置参数。) 身份映射文件包含的下面通用的格式:

map-name system-username database-username

注释和空白与pg_hba.conf文件里的一样处理。map-name 是将要用于在pg_hba.conf中引用这个映射的任意名称。 另外两个字段声明操作系统用户名和匹配的数据库用户名。同一个map-name 可以在一个映射中多次使用来声明多个用户映射。 对一个操作系统用户可以映射为多少个数据库用户没有限制,反之亦然。

对一个给定的操作系统用户可以映射为多少个数据库用户没有限制,反之亦然。 因此,映射中的记录应该被认为是意为"这个操作系统用户被允许作为这个数据库用户连接", 而不是意味着他们是相等的。如果有那对用户名的任意映射记录从带有那个用户请求连接的数据库用户名的外部认证系统获得, 那么这个连接将被允许。

如果system-username字段以一个反斜杠(/)开始, 那么该字段的剩余部分被作为一个规则表达式对待。(参阅第 9.7.3.1 节 获取关于PostgreSQL规则表达式语法的细节。)规则表达式可以包含一个捕获, 或括号的子表达式,然后可以在database-username字段中作为\1 (backslash-one)引用。 这允许多用户名的映射在一行中,这对于简单的语法替换特别有用。例如,这些记录:

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

将为带有系统用户名的以@mydomain.com结尾的用户删除域部分, 并且允许系统名以@otherdomain.com结尾的任意用户作为guest登录。

提示: 记住,缺省的,一个规则表达式只可以匹配字符串的一部分。使用^$通常是明智的, 就像上面例子所示,来迫使匹配成为整个系统用户名。

在系统启动和主服务器收到一个SIGHUP 信号的时候会读取pg_ident.conf文件。如果你在一台活跃的系统上编辑该文件, 那么你需要给主服务器发信号(使用pg_ctl reloadkill -HUP)令其重新读取该文件。

例 19-2里是一个可以和在例 19-1 里面演示的pg_hba.conf文件配合使用的pg_ident.conf文件。 在这个例子的设置里,任何登录到 192.168 网络里的机器的用户,如果用户名不是bryanh, ann, robert 就不能获准访问。Unix 用户robert只有在试图以 PostgreSQL用户bob身份连接时才允许访问,而不能是robert 或其它什么身份。ann将只允许以ann的身份连接。用户bryanh 允许以他自己的bryanh身份或者作为guest1进行连接。

例 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