这种身份验证方法与 password
类似,只是它使用 LDAP 作为密码验证方法。LDAP 只用于验证用户名/密码对。因此,用户必须在数据库中已存在,才能使用 LDAP 进行身份验证。
LDAP 身份验证可以以两种模式运行。在第一种模式(我们称之为简单绑定模式)中,服务器将绑定到构造为 prefix
username
suffix
的识别名称。通常,prefix
参数用于指定 cn=
,或 Active Directory 环境中的 DOMAIN
\
。 suffix
用于指定非 Active Directory 环境中 DN 的剩余部分。
在第二种模式(我们称之为搜索+绑定模式)中,服务器首先使用 ldapbinddn
和 ldapbindpasswd
指定的固定用户名和密码绑定到 LDAP 目录,并搜索尝试登录数据库的用户。如果没有配置用户和密码,则将尝试匿名绑定到目录。搜索将在 ldapbasedn
的子树上进行,并尝试对 ldapsearchattribute
中指定的属性进行精确匹配。一旦在此搜索中找到用户,服务器将使用客户端指定的密码重新绑定到目录,以验证登录是否正确。此模式与其他软件(如 Apache mod_authnz_ldap
和 pam_ldap
)中使用的 LDAP 身份验证方案相同。这种方法允许在目录中用户对象的位置更加灵活,但会导致对 LDAP 服务器进行两次额外的请求。
以下配置选项在两种模式中都使用
ldapserver
要连接到的 LDAP 服务器的名称或 IP 地址。可以指定多个服务器,用空格分隔。
ldapport
要连接到的 LDAP 服务器上的端口号。如果没有指定端口,将使用 LDAP 库的默认端口设置。
ldapscheme
设置为 ldaps
以使用 LDAPS。这是通过 SSL 使用 LDAP 的非标准方法,某些 LDAP 服务器实现支持。有关替代方法,另请参见 ldaptls
选项。
ldaptls
设置为 1,使 PostgreSQL 和 LDAP 服务器之间的连接使用 TLS 加密。这将根据 RFC 4513 使用 StartTLS
操作。有关替代方法,另请参见 ldapscheme
选项。
请注意,使用 ldapscheme
或 ldaptls
只会加密 PostgreSQL 服务器和 LDAP 服务器之间的流量。PostgreSQL 服务器和 PostgreSQL 客户端之间的连接将仍然未加密,除非在那里也使用 SSL。
以下选项仅在简单绑定模式中使用
ldapprefix
在执行简单绑定身份验证时,在形成要绑定到的 DN 时要附加到用户名的字符串。
ldapsuffix
在执行简单绑定身份验证时,在形成要绑定到的 DN 时要附加到用户名的字符串。
以下选项仅在搜索+绑定模式中使用
ldapbasedn
在执行搜索+绑定身份验证时,在其中开始搜索用户的根 DN。
ldapbinddn
要绑定到目录以执行搜索的用户 DN(在执行搜索+绑定身份验证时)。
ldapbindpasswd
要绑定到目录以执行搜索的用户密码(在执行搜索+绑定身份验证时)。
ldapsearchattribute
在执行搜索+绑定身份验证时,要与用户名匹配的属性。如果没有指定属性,将使用 uid
属性。
ldapsearchfilter
在执行搜索+绑定身份验证时要使用的搜索过滤器。 $username
的出现将被用户名替换。这允许使用比 ldapsearchattribute
更灵活的搜索过滤器。
ldapurl
一个 RFC 4516 LDAP URL。这是以更紧凑和标准的形式编写某些其他 LDAP 选项的替代方法。格式为
ldap[s]://host
[:port
]/basedn
[?[attribute
][?[scope
][?[filter
]]]]
scope
必须是 base
、one
、sub
中的一个,通常是最后一个。(默认值为 base
,通常在这种应用中没有用。) attribute
可以指定单个属性,在这种情况下,它用作 ldapsearchattribute
的值。如果 attribute
为空,则 filter
可以用作 ldapsearchfilter
的值。
URL 方案 ldaps
选择 LDAPS 方法通过 SSL 建立 LDAP 连接,等同于使用 ldapscheme=ldaps
。要使用使用 StartTLS
操作的加密 LDAP 连接,请使用正常的 URL 方案 ldap
,并除 ldapurl
之外还指定 ldaptls
选项。
对于非匿名绑定,必须分别指定 ldapbinddn
和 ldapbindpasswd
选项。
LDAP URL 目前仅在 OpenLDAP 中受支持,在 Windows 上不受支持。
混合使用简单绑定和搜索+绑定的配置选项会导致错误。
使用搜索+绑定模式时,搜索可以使用使用 ldapsearchattribute
指定的单个属性执行,也可以使用使用 ldapsearchfilter
指定的自定义搜索过滤器执行。指定 ldapsearchattribute=foo
等同于指定 ldapsearchfilter="(foo=$username)"
。如果未指定这两个选项,默认值为 ldapsearchattribute=uid
。
如果 PostgreSQL 使用 OpenLDAP 作为 LDAP 客户端库进行编译,则可以省略 ldapserver
设置。在这种情况下,将通过 RFC 2782 DNS SRV 记录查找主机名和端口列表。将查找名称 _ldap._tcp.DOMAIN
,其中 DOMAIN
从 ldapbasedn
中提取。
以下是一个简单绑定 LDAP 配置的示例
host ... ldap ldapserver=ldap.example.net ldapprefix="cn=" ldapsuffix=", dc=example, dc=net"
当请求到数据库服务器的连接作为数据库用户 someuser
时,PostgreSQL 将尝试使用 DN cn=someuser, dc=example, dc=net
和客户端提供的密码绑定到 LDAP 服务器。如果该连接成功,则授予数据库访问权限。
以下是一个搜索+绑定配置的示例
host ... ldap ldapserver=ldap.example.net ldapbasedn="dc=example, dc=net" ldapsearchattribute=uid
当请求到数据库服务器的连接作为数据库用户 someuser
时,PostgreSQL 将尝试匿名绑定(因为未指定 ldapbinddn
)到 LDAP 服务器,在指定的基 DN 下执行 (uid=someuser)
搜索。如果找到条目,它将尝试使用找到的信息和客户端提供的密码进行绑定。如果第二次绑定成功,则授予数据库访问权限。
以下是以 URL 形式编写的相同搜索+绑定配置
host ... ldap ldapurl="ldap://ldap.example.net/dc=example,dc=net?uid?sub"
某些其他支持针对 LDAP 进行身份验证的软件使用相同的 URL 格式,因此更容易共享配置。
以下是一个搜索+绑定配置的示例,它使用 ldapsearchfilter
而不是 ldapsearchattribute
来允许通过用户 ID 或电子邮件地址进行身份验证
host ... ldap ldapserver=ldap.example.net ldapbasedn="dc=example, dc=net" ldapsearchfilter="(|(uid=$username)(mail=$username))"
以下是一个搜索+绑定配置的示例,它使用 DNS SRV 发现来查找域名 example.net
的 LDAP 服务的主机名和端口
host ... ldap ldapbasedn="dc=example,dc=net"
由于 LDAP 通常使用逗号和空格来分隔 DN 的不同部分,因此在配置 LDAP 选项时,通常需要使用双引号的参数值,如示例所示。
如果您在文档中看到任何不正确的内容,与您对特定功能的体验不符,或需要进一步说明,请使用 此表格 报告文档问题。