Перейти к основному содержимому

Карты имен пользователей

примечание

Эта страница переведена при помощи нейросети GigaChat.

При использовании внешней системы аутентификации, такой как Ident или GSSAPI, имя пользователя операционной системы, инициировавшего соединение, может не совпадать с именем пользователя базы данных (роли), которое должно использоваться. В этом случае можно применить карту имен пользователей для сопоставления имени пользователя операционной системы с пользователем базы данных. Чтобы использовать сопоставление имен пользователей, укажите map=map-name в поле параметров в pg_hba.conf. Эта опция поддерживается для всех методов аутентификации, которые получают внешние имена пользователей. Поскольку для разных соединений могут потребоваться разные сопоставления, имя карты, которую необходимо использовать, указывается в параметре map-name в pg_hba.conf, чтобы указать, какую карту использовать для каждого отдельного соединения.

Карты имен пользователей определяются в файле карты идентификаторов, который по умолчанию называется pg_ident.conf и хранится в каталоге данных кластера. Однако возможно разместить файл карты в другом месте (смотрите параметр конфигурации ident_file). Файл карты идентификаторов содержит строки общего вида:

map-name system-username database-username

Комментарии, пробелы и продолжения строк обрабатываются так же, как в pg_hba.conf. map-name --- это произвольное имя, которое будет использоваться для ссылки на это сопоставление в pg_hba.conf. Два других поля указывают имя пользователя операционной системы и соответствующее имя пользователя базы данных. Один и тот же map-name может быть использован повторно для указания нескольких сопоставлений пользователей в одной карте.

Нет никаких ограничений относительно того, сколько пользователей базы данных может соответствовать одному пользователю операционной системы или наоборот. Таким образом, записи в карте должны рассматриваться как означающие «этот пользователь операционной системы имеет право подключиться к этому пользователю базы данных», а не подразумевать их эквивалентность. Подключение будет разрешено, если карта содержит хотя бы одну запись, связывающую имя пользователя из внешней системы аутентификации с именем пользователя базы данных, запрашиваемого пользователем.

Если поле system-username начинается со слэша (/), оставшаяся часть поля обрабатывается как регулярное выражение. Смотрите раздел «Детали регулярного выражения» для получения подробной информации о синтаксисе регулярных выражений PostgreSQL. Регулярное выражение может включать один захват или подвыражение в скобках. Часть имени системного пользователя, совпавшая с захватом, может быть указана в поле database-username как \1. Это позволяет сопоставлять несколько имен пользователей в одной строке, что особенно полезно для простых синтаксических замен.

Например, эти строки удалят доменную часть для пользователей с системными именами пользователей, которые заканчиваются на @mydomain.com, и разрешит любому пользователю, чье системное имя заканчивается на @otherdomain.com, войти в систему как guest:

mymap   /^(.*)@mydomain\.com$      \1
mymap /^(.*)@otherdomain\.com$ guest
Совет

Имейте в виду, что по умолчанию регулярное выражение может соответствовать только части строки. Обычно целесообразно использовать ^ и $, как показано в приведенном выше примере, чтобы заставить соответствие быть ко всему имени системного пользователя.

Файл pg_ident.conf считывается при запуске и когда основной серверный процесс получает сигнал SIGHUP. При редактировании файла в активной системе необходимо послать сигнал постмастеру (с использованием команд pg_ctl reload, вызова SQL-функции pg_reload_conf() или отправки сигнала kill -HUP) для перечитывания файла.

Представление системы pg_ident_file_mappings может быть полезно для предварительного тестирования изменений файла pg_ident.conf, или для диагностики проблем, если загрузка файла не дала желаемого эффекта. Строки в представлении с непустыми полями error указывают на проблемы в соответствующих строках файла.

Файл, который можно использовать вместе с файлом pg_hba.conf в примере записи pg_hba.conf, показан в Примере 21.2. В этом примере любому, кто вошел в систему на машине в сети 192.168, у которой нет имени пользователя операционной системы bryanh, ann или robert, не будет предоставлен доступ. Пользователь Unix robert сможет получить доступ только тогда, когда он попытается подключиться как пользователь PostgreSQL bob, а не как robert или кто-либо еще. ann сможет подключаться только как ann. Пользователь bryanh сможет подключаться либо как bryanh, либо как guest1.

Пример файла 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