OpenLDAP 代理用于在客户端和服务器之间代理 LDAP 请求和响应,不同的服务器可能使用不同的表示/属性来表示相同的内容。例如,在一个 LDAP 服务器中,firstName 可能由 firstName 表示,在另一个服务器中可能由 givenName 表示。但是,从客户端的角度来看,它只想获取 firstName,并不关心后端属性。
在这种情况下,属性映射可以帮助提供后端数据的虚拟视图。在另一篇文章 OpenLDAP 代理——技巧和提示 中,我们介绍了如何使用overlay rwm实现属性映射。当我们只有一个后端 LDAP 服务器需要代理时,这种方法非常有效。
但是,如果我们为数据库元数据后端配置了两个或多个 LDAP 服务器会怎样?由于rwm-map会全局应用映射,而不是基于服务器的,因此属性映射可能不适用于某些服务器,这将是一个问题。让我们看看这是如何发生的。
假设在 OpenLDAP 代理元数据后端中配置了两个 LDAP 服务器,这两个服务器中的属性如下:
服务器 1
firtsName: myFirstName
sn: myLastName
服务器 2
givenName: myFirstName
lastName: myLastName
在 OpenLDAP 代理中,givenName 映射到 firstName。
overlay rwm
rwm-map attribute firstName givenName
当运行ldapsearch获取firstName属性时,firstName 将首先映射到 givenName,OpenLDAP 代理将属性 givenName 发送到服务器 1,但显然服务器 1 没有 givenName 属性,因此它将返回空值。在服务器 2 中,因为它有 givenName,所以将返回名称值。这种行为并非预期,显然我们期望两个服务器都应该返回 firstName。
似乎 rwm-map 无法解决这个问题。幸运的是,如果您仔细阅读slapd-meta 手册页,您会发现它提供了一个map选项,可以在服务器级别提供属性映射。
map {attribute|objectclass} [<本地名称>|*] {<外部名称>|*}
这将映射 LDAP 后端中的对象类和属性。
这意味着您可以为不同的服务器将不同的属性名称映射到相同的本地属性名称。对于 firstName,如果进行如下配置。
uri "server1"
suffixmassage "local" "target"
map attribute firstName firstName #也可以忽略
uri "server2"
suffixmassage "local" "target"
map attribute firstName givenName
对于服务器 1,firstName 将映射到 firstName;对于服务器 2,givenName 将映射到 firstName;当发出 ldapsearch 请求时,客户端将看到从两个服务器返回的值。这正是预期的结果。
需要注意的是,后端 ldap 不再支持 map,而应该使用 rwm-map。这是有效的,因为数据库 ldap旨在在发出任何请求时代理到一个 LDAP 服务器。
希望这有帮助。