понедельник, 21 января 2013 г.

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

Когда Вы используете внешние системы аутентификации как Ident или GSSAPI, то имя пользователя ОС, который устанавливает соединение, может не совпадать с именем пользователя, под которым он хочет подключиться. В этом случае карта имён пользователей может использоваться ОС для отображения имени пользователя ОС на имя пользователя БД. Для того, чтобы использовать отображение имён пользователей, используйте опцию map=map-name в поле опций pg_hba.conf. Эта опция поддерживается для всех методов аутентификации, которые получают внешние имена пользователей. Так как для разных подключений могут быть необходимы разные карты, имя карты в параметре указывает, какую именно карту использовать в этом случае.
Карты имён пользователей определяются в ident map file, который по умолчанию называется pg_ident.conf и хранится в каталоге данных. (Его возможно разместить и в другом месте - для этого используется параметр ident_file). Этот файл должен содержать строки в следующем формате:
map-name system-username database-username
Комментарии и пробелы обрабатываются так же как и в pg_hba.conf. map-name - обычное имя, которое используется как имя карты в pg_hba.conf. Два других поля определяют имя пользователя ОС и соответствующее имя пользователя БД. Одно и то же map-name можно несколько раз упоминать для разных пользователей в пределах одного файла.
Нет ограничений по соответствию имён пользователей ОС именам пользователей БД и наоборот. Таким образом, записи в карте должны трактоваться как "этот пользователь ОС может подключаться как этот пользователь БД", а не рассматривать их как аналоги. Подключение будет разрешено в случае если есть строка в карте, которая связывает имя пользователя, полученное из внешней системы аутентификации, с именем пользователя, под которым хотят подключиться.
Если поле system-username начинается со слеша (/), оставшаяся часть поля будет трактоваться как регулярное выражение (в разделе 9.7.3.1 подробно описан синтаксис регулярных выражений PostgreSQL). Регулярное выражение может включать одно выражение или субвыражение в скобках, на которое можно потом сослаться в поле database-username при помощи \1 (обратный слеш и единица). Это позволяет отображать несколько имён пользователей на одной строке, что очень полезно для простого синтаксиса замены. Например, эти записи:
mymap       /^(.*)@mydomain\.com$        \1
mymap       /^(.*)@otherdomain\.com$     guest
удалит часть домена из имени пользователя, которое заканчивается на @mydomain.com и позволяет любому, чьё имя заканчивается на @otherdomain.com, заходить с именем guest.
Совет: Помните, что по умолчанию регулярное выражение может соответствовать только части строки. Обычно разумно использовать ^ и $, как показано в нашем примере, чтобы заставить шаблон соответствовать всему имени пользователя.
Файл pg_ident.conf прочитывается при запуске сервера и при получении главным процессом сигнала SIGHUP. Если Вы отредактировали файл на работающей системе, Вы должны послать сигнал основному процессу (при помощи pg_ctl reload или kill -HUP) для того, чтобы он перечитал файл.
Файл pg_ident.conf, который может быть использован вместе с файлом pg_hba.conf из примера в прошлом разделе, приведён ниже. В нашем примере, любой, кто зашёл на машину в сети 192.168 не под именем bryanh, ann или robert не получит доступа. Пользователь robert получит право подключиться к PostgreSQL только под именем bob, не как robert или ещё кто-то. ann сможет подключиться только как ann. Пользователь bryanh сможет подключиться либо как bryanh, либо как guest1.

# MAPNAME       SYSTEM-USERNAME         PG-USERNAME

omicron         bryanh                  bryanh
omicron         ann                     ann
# robert на этой машине будет пользователем bob
omicron         robert                  bob
# bryanh может подключиться и как guest1
omicron         bryanh                  guest1

1 комментарий: