On this page
20.2. 用户名 Map
当使用外部身份验证系统(例如 Ident 或 GSSAPI)时,发起连接的 os 用户的名称可能与要使用的数据库用户(角色)不同。在这种情况下,可以应用用户名 Map 来将 os 用户名 Map 到数据库用户。要使用用户名 Map,请在pg_hba.conf
的选项字段中指定map
= * map-name
。接收外部用户名的所有身份验证方法均支持此选项。由于不同的连接可能需要不同的 Map,因此在pg_hba.conf
的 map-name
*参数中指定要使用的 Map 的名称,以指示每个单独的连接使用哪个 Map。
用户名 Map 在 identMap 文件中定义,该文件默认情况下名为pg_ident.conf
,并存储在集群的数据目录中。 (但是,可以将 Map 文件放置在其他位置;请参阅ident_file配置参数。)identMap 文件包含以下常规形式的行:
map-name system-username database-username
Comments 和空格的处理方式与pg_hba.conf
相同。 * map-name
*是一个任意名称,将用于引用pg_hba.conf
中的此 Map。其他两个字段指定 os 用户名和匹配的数据库用户名。相同的map-name
*可以重复使用,以在单个 Map 中指定多个用户 Map。
对于给定的 os 用户可以对应多少个数据库用户,没有限制,反之亦然。因此,Map 中的条目应被认为是“允许该 os 用户以该数据库用户身份连接”,而不是暗示它们是等效的。如果有任何 Map 条目将从外部认证系统获得的用户名与用户请求连接的数据库用户名配对,则将允许连接。
如果* system-username
字段以斜杠(/
)开头,则该字段的其余部分将被视为正则表达式。 (有关 PostgreSQL 正则表达式语法的详细信息,请参见Section 9.7.3.1。)正则表达式可以包含单个捕获或带括号的子表达式,然后可以在 database-username
*字段中将其称为\1
(反斜杠-1)。这允许在单个行中 Map 多个用户名,这对于简单的语法替换特别有用。例如,这些条目
mymap /^(.*)@mydomain\.com$ \1
mymap /^(.*)@otherdomain\.com$ guest
将删除系统用户名以@mydomain.com
结尾的用户的域部分,并允许任何系统名以@otherdomain.com
结尾的用户以guest
身份登录。
Tip
请记住,默认情况下,正则表达式只能匹配一部分字符串。如上例所示,通常明智的做法是使用^
和$
来强制匹配整个系统用户名。
在启动时以及主服务器进程收到 SIGHUP signal 时,将读取pg_ident.conf
文件。如果在活动系统上编辑文件,则需要向邮局局长发 signal(使用pg_ctl reload
,调用 SQL 函数pg_reload_conf()
或使用kill -HUP
)以使其重新读取文件。
Example 20.2中显示了可以与Example 20.1中的pg_hba.conf
文件结合使用的pg_ident.conf
文件。在此示例中,登录到 192.168 网络上没有 os 用户名bryanh
,ann
或robert
的计算机的任何人都不会被授予访问权限。仅当 Unix 用户robert
尝试以 PostgreSQL 用户bob
的身份(而不是robert
或其他任何人)连接时,才被允许访问。 ann
仅允许以ann
的身份进行连接。用户bryanh
将被允许以bryanh
或guest1
的身份进行连接。
例 20.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