# 21.2.
用户名映射使用 Ident 或 GSSAPI 等外部身份验证系统时,启动连接的操作系统用户的名称可能与要使用的数据库用户(角色)不同。在这种情况下,可以应用用户名映射来将操作系统用户名映射到数据库用户。要使用用户名映射,请指定
地图*=
地图名称在选项字段中
pg_hba.conf.所有接收外部用户名的身份验证方法都支持此选项。由于不同的连接可能需要不同的映射,因此要使用的映射的名称在
*地图名称参数输入
pg_hba.conf
指示要为每个单独的连接使用哪个映射。用户名映射在 ident 映射文件中定义,默认命名为
pg_ident.conf并存储在集群的数据目录中。(但是,可以将地图文件放在其他地方;请参阅识别_文件配置参数。) ident 映射文件包含以下一般形式的行:
map-name system-username database-username
注释、空格和续行的处理方式与pg_hba.conf
.这*地图名称
是一个任意名称,将用于在pg_hba.conf
.其他两个字段指定操作系统用户名和匹配的数据库用户名。相同地图名称
*可以重复使用以在单个地图中指定多个用户映射。
对于给定的操作系统用户可以对应多少数据库用户没有限制,反之亦然。因此,映射中的条目应该被认为是“允许这个操作系统用户作为这个数据库用户连接”,而不是暗示它们是等价的。如果有任何映射条目将从外部身份验证系统获得的用户名与用户请求连接的数据库用户名配对,则将允许连接。
如果*系统用户名
字段以斜杠 (/
),该字段的其余部分被视为正则表达式。(看第 9.7.3.1 节有关 PostgreSQL 正则表达式语法的详细信息。)正则表达式可以包含单个捕获或带括号的子表达式,然后可以在数据库用户名
*字段为\1
(反斜杠一)。这允许在一行中映射多个用户名,这对于简单的语法替换特别有用。例如,这些条目
mymap /^(.*)@mydomain\.com$ \1
mymap /^(.*)@otherdomain\.com$ guest
将删除系统用户名以结尾的用户的域部分@mydomain.com
, 并允许系统名称以@otherdomain.com
登录为客人
.
# 提示
请记住,默认情况下,正则表达式只能匹配字符串的一部分。使用通常是明智的^
和$
,如上例所示,强制匹配到整个系统用户名。
这pg_ident.conf
文件在启动和主服务器进程收到 SIGHUP 时读取信号。如果您在活动系统上编辑文件,您将需要向 postmaster 发送信号(使用pg_ctl 重载
,调用SQL函数pg_reload_conf()
,或使用杀死-HUP
) 使其重新读取文件。
一种pg_ident.conf
可以与该文件一起使用的文件pg_hba.conf
文件在示例 21.1显示在示例 21.2.在此示例中,任何人登录到 192.168 网络上没有操作系统用户名的计算机布赖恩
,安
或罗伯特
不会被允许进入。Unix用户罗伯特
只有当他尝试以PostgreSQL用户身份连接时才允许访问上下快速移动
,而不是罗伯特
或者其他任何人。安
只允许在安
使用者布莱恩
将被允许作为布莱恩
或者作为客人1
.
例21.2.一个例子pg_ident。形态
文件
# 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