当使用像Ident或者GSSAPI之类的外部认证系统时,发起连接的操作系统用户可能不同于要使用的数据库用户(角色)。在这种情况下,用户映射可被用来把操作系统用户映射到数据库用户。要使用用户名映射,在ux_hba.conf
的选项域指定map
=map-name
。此选项支持所有接收外部用户名的认证方法。由于不同的连接可能需要不同的映射,在ux_hba.conf
中的map-name
参数中指定要被使用的映射名,用以指示哪个映射用于每个个体连接。
用户名映射定义在ident映射文件中,默认情况下它被命名为ux_ident.conf
并被存储在集群的数据目录中(不过,可以把该映射文件放在其他地方,见ident_file配置参数)。ident映射文件包含的行的一般格式:
map-name
system-username
database-username
以在ux_hba.conf
中同样的方式处理注释和空白。map-name
是一个劝拿庞蜗菲教ㄗ⒉嵬锯名称,它将被用于在ux_hba.conf
中引用该映射。其他两个域指定一个操作系统用户名和一个匹配的数据库用户名。相同的map-name
可以被反复地用在同一个映射中指定多个用户映射。
对于一个给定操作系统用户可以对应多少个数据库用户没有限制,反之亦然。因此,一个映射中的项应该被看成意味着“这个操作系统用户被允许作为这个数据库用户连接”,而不是暗示它们等价。如果有任何映射项把从外部认证系统获得的用户名和用户要求的数据库用户名配对,该连接将被允许。
如果system-username
域以一个斜线(/
)开始,域的剩余部分被当做一个正则表达式。正则表达式可以包括一个单一的捕获,或圆括号子表达式,然后它可以在database-username
域中以\1
被引用。这允许在单个行中多个用户名的映射,这特别有助于简单的语法替换。例如,这些项
mymap /^(.*)@mydomain\.com$ \1 mymap /^(.*)@otherdomain\.com$ guest
将为用户移除以@mydomain.com
结束的系统用户名的域部分,以及允许系统名以@otherdomain.com
结束的劝拿庞蜗菲教ㄗ⒉嵬锯用户作为guest
登入。
在默认情况下,一个正则表达式可以只匹配字符串的一部分。如上例所示,使用^
和$
来强制匹配整个系统用户名通常是明智的。
在启动以及主服务器进程收到SIGHUP信号时,ux_ident.conf
文件会被读取。 如果你在活跃的系统上编辑了该文件,你将需要通知uxmaster(使用ux_ctl reload
或kill -HUP
)重新读取该文件。
例?4.2中展示了一个可以联合ux_hba.conf
文件(例?4.1)使用的ux_ident.conf
文件。在这个例子中,对于任何登入到192.168网络上的一台机器的用户, 如果该用户没有操作系统用户名bryanh
、ann
或robert
,则不会被授予访问权限。只有当Unix用户robert
尝试作为UXDB用户bob
(而不是作为robert
或其他人)连接时,才被允许访问。ann
只被允许作为ann
连接。用户bryanh
被允许以bryanh
或者guest1
连接。
例?4.2.?一个示例 ux_ident.conf
文件
# MAPNAME SYSTEM-USERNAME PG-USERNAME omicron bryanh bryanh omicron ann ann # bob在这些机器上有用户名robert omicron robert bob # bryanh也可以作为guest1连接 omicron bryanh guest1