34.17. Получение параметров соединения через LDAP
Если библиотека libpq была собрана с поддержка LDAP (configure
передавался ключ
), такие параметры соединения, как --with-ldap
host
и dbname
, можно получить через LDAP с центрального сервера. Преимущество такого подхода в том, что при изменении параметров подключения к базе данных свойства соединения не придётся изменять на всех клиентских компьютерах.
Для получения параметров соединений через LDAP используется файл соединений служб pg_service.conf
(см. Раздел 34.16). Строка в pg_service.conf
, начинающаяся с указания протокола ldap://
, будет воспринята как URL в LDAP и выполнится как запрос к LDAP. Результатом запроса должен быть список пар keyword = value
, которые и будут задавать параметры соединений. Заданный URL должен соответствовать RFC 1959 и иметь следующий вид:
ldap://[имя_сервера
[:порт
]]/база_поиска
?атрибут
?область_поиска
?фильтр
; по умолчанию имя_сервера
— localhost
, а порт
— 389.
Обработка pg_service.conf
прекращается после удачного поиска в LDAP, но если с сервером LDAP связаться не удаётся, обрабатываются следующие строки этого файла. Так сделано для того, чтобы можно было реализовать запасные варианты, добавив дополнительные строки с URL LDAP, указывающими на другие серверы LDAP, или классические пары keyword = value
, либо используя параметры соединений по умолчанию. Если же вы хотите получить ошибку в этой ситуации, добавьте после строки с URL-адресом LDAP синтаксически некорректную строку.
Простую запись LDAP, созданную из такого файла LDIF
version:1 dn:cn=mydatabase,dc=mycompany,dc=com changetype:add objectclass:top objectclass:device cn:mydatabase description:host=dbserver.mycompany.com description:port=5439 description:dbname=mydb description:user=mydb_user description:sslmode=require
можно запросить из каталога LDAP, указав следующий URL:
ldap://ldap.mycompany.com/dc=mycompany,dc=com?description?one?(cn=mydatabase)
Также возможно сочетать обычные записи в файле служб с поиском в LDAP. Полный пример описания службы в pg_service.conf
может быть таким:
# в LDAP хранится только имя и порт сервера; имя базы и пользователя нужно задать явно [customerdb] dbname=customer user=appuser ldap://ldap.acme.com/cn=dbserver,cn=hosts?pgconnectinfo?base?(objectclass=*)