![]() |
![]() |
![]() |
Управление пользователями Чтобы создать подключение к PostgreSQL, необходимо сообщить о себе некоторые данные. По имени пользователя система узнает, кто именно подключается к базе данных. Имена пользователей PostgreSQL не всегда совпадают с именами пользователей операционной системы, хотя такое совпадение и не запрещено. Каждому пользователю PostgreSQL назначается внутренний системный идентификатор (sysid) и пароль, хотя пароль не всегда обязателен для подключения (это зависит от файла конфигурации pg_hba.conf, о котором говорилось в главе 8). Системный идентификатор связывает объекты базы данных с владельцем (так называется пользователь, которому разрешено предоставлять и отзывать права доступа к объекту). Помимо прав, предоставляемых владельцами объектов, при создании учетной записи пользователю также могут быть предоставлены глобальные права. Они определяют, разрешено ли пользователю создавать и уничтожать базы данных и является ли он суперполъзователем (пользователем, обладающим всеми правами во всех базах данных, включая право создания других пользователей). Глобальные права могут быть в любой момент изменены текущим суперпользователем. В PostgreSQL по умолчанию создается один суперпользователь с именем postgres. Все остальные пользователи создаются этим суперпользователем или другим, созданным позднее. Просмотр списка пользователей Вся информация о пользователях PostgreSQL хранится в системной таблице pg_shadow, структуру которой иллюстрирует табл. 10.1. Выборка из этой таблицы разрешена только суперпользователям, хотя ограниченное представление этой таблицы с именем pg_user доступно и для обычных пользователей. Таблица 10.1. Структура таблицы pg_shadow
Основное различие между данными, содержащимися в таблицах pg_user и pg_shadow, заключается в том, что в pg_user отсутствует значение в поле passwd (оно заменяется несколькими звездочками). Эта мера безопасности гарантирует, что обычный пользователь не сможет получить несанкционированный доступ к чужим паролям. В поле usename хранится имя системного пользователя, которое представляет собой уникальную строку. Существование одноименных пользователей не допускается, потому что пользователи являются глобальными объектами базы данных. В поле usesysid хранится уникальный целый идентификатор, связанный с пользователем. Поля usecreatedb и usesuper содержат информацию о привилегиях, которые могут присваиваться пользователю при создании (см. следующий подраздел). Создание пользователей В PostgreSQL существует два способа создания учетных записей пользователей базы данных. Оба способа требуют аутентификации суперпользователя, поскольку только суперпользователям разрешено создавать новых пользователей. Первый способ основан па выполнении команды SQL CREATE USER в клиенте PostgreSQL (например, psql) после прохождения аутентификации. Второй способ, основанный на использовании программы createuser, более удобен для системного администратора, поскольку все действия выполняются одной командой без взаимодействия с клиентом PostgreSQL. Создание пользователей командой SQL CREATE USER Команда CREATE USER имеет всего один обязательный параметр — имя нового пользователя. Ей также можно передать множество других параметров, в том числе пароль, системный идентификатор, группу и права, назначаемые новому пользователю. Полный синтаксис команды CREATE USER выглядит так: CREATE USER пользователь [ WITH [ SYSID aid ] [ PASSWORD 'пароль' ] ] [ CREATEDB | NOCREATEDB ] [ CREATEUSER | NOCREATEUSER ] [ IN GROUP группа [. ...] ] [ VALID UNTIL 'срок' ] Имя создаваемого пользователя определяется параметром пользователь. В системе не допускается присутствие двух пользователей с одинаковыми именами. За ключевым словом WITH следуют секции SYSID и/или PASSWORD. Все остальные необязательные секции могут следовать в произвольном порядке (ключевое слово WITH для них не обязательно). Ниже перечислены все необязательные ключевые слова.
При отсутствии ключевых слов CREATEDB и CREATEUSER создается «обычный» пользователь, не обладающий особыми привилегиями. Он не может ни создавать, ни уничтожать базы данных и других пользователей. Обычные пользователи могут подключаться к базам данных PostgreSQL, но при этом они могут выполнять лишь те команды, выполнение которых им было разрешено (см. раздел «Предоставление привилегий» этой главы). В листинге 10.1 создается обычный пользователь с именем salesuser и паролем N0rm4!, заданным в секции WITH PASSWORD. Секция VALID UNTIL отсутствует, поэтому пароль остается действительным в течение неограниченного времени. Листинг 10.1. Создание обычного пользователя tempiatel=# CREATE USER dbuser CREATEDB tempiatel-# WITH PASSWORD 'DbuSSr' tempiatel-# VALID UNTIL '2002-11-11'; CREATE USER Сообщение CREATE USER, выданное сервером, означает, что пользователь был создан успешно. Также возможны сообщения об ошибках.
Если в PostgreSQL требуется создать пользователя, которому разрешено создавать базы данных, но запрещено создавать и уничтожать пользователей PostgreSQL, укажите ключевое слово CREATEDB вместо CREATEUSER. Пользователь сможет создавать базы данных, а также уничтожать базы данных, принадлежащие ему. Операции создания и удаления баз данных рассматривались в главе 9. В листинге 10.2 создается пользователь dbuser, которому разрешено создавать новые базы данных. Для этого после имени пользователя указывается ключевое слово CREATEDB. Также обратите внимание на секции WITH PASSWORD и VALID UNTIL -пользователю dbuser назначается пароль DbuS3r, действующий до 11 ноября 2002 года. Листинг 10.2. Создание пользователя с правом CREATEDB tempiatel=# CREATE USER dbuser CREATEDB tempiatel-# WITH PASSWORD 'DbuS3r' tempiatel-f VALID UNTIL '2002-11-11'; CREATE USER Замена пароля с истекшим сроком действия не изменяет значения, указанного в секции VALUD UNTIL. Чтобы заново активизировать пользователя с истекшим сроком действия пароля, следует выполнить команду ALTER USER с секциями WITH PASSWORD и VALID UNTIL. Дополнительная информация о команде ALTER USER приведена в подразделе «Модификация пользователей» этого раздела. ВНИМАНИЕ Секция VALID UNTIL не относится к доверенным хостам, для которых пароль не нужен. Аутентификация хостов рассматривалась в главе 8. Вероятно, помимо суперпользователя postgres вам понадобятся и другие суперпользователи, однако при их создании необходима осторожность. Супериоль-зователям предоставляются все права PostgreSQL, включая права создания и удаления пользователей, а также уничтожения баз данных. В листинге 10.3 приведен пример создания суперпользователя PostgreSQL с именем manager из приглашения psql. Листинг 10.3. Создание суперпользователя tempiatel=# CREATE USER manager CREATEUSER; CREATE USER Создание пользователей при помощи сценария createuser Сценарий createuser запускается непосредственно из командной строки и работает в одном из двух режимов. При вызове без аргументов он запрашивает имя пользователя с его правами и пытается установить локальное подключение к PostgreSQL. Во втором режиме имя пользователя и параметры передаются в командной строке. Как и в других приложениях командной строки PostgreSQL, ключи задаются в коротком (с одним дефисом и одним символом) или в длинном формате (с двумя дефисами и полным ключом). Синтаксис командной строки приложения createuser: createuser [ параметры ] [ пользователь ] Параметр пользователь представляет имя создаваемого-пользователя. Строка параметров содержит один из ключей, перечисленных ниже.
Если ключи -d, -D, -а, -А или имя пользователя отсутствуют, программа createuser запрашивает все недостающие данные. Это связано с тем, что PostgreSQL не строит никаких предположений относительно прав нового пользователя или его имени. В листинге 10.4 создается пользователь newuser, которому запрещено создавать новые базы данных и новых пользователей. Листинг 10.4. Создание пользователя сценарием createuser [jworsley@booktown -]$ createuser -U manager -D -A newuser CREATE USER Обратите внимание на ключ -U manager, переданный сценарию createuser. Он указывает на то, что к PostgreSQL подключается пользователь manager, а не jworsl ey, как предположил бы сценарий по имени системной учетной записи, вызвавшей сценарий. Если вы предпочитаете, чтобы все параметры запрашивались в интерактивном режиме (и вам не приходилось запоминать все ключи или каждый раз обращаться к документации), просто не указывайте те ключи, в которых вы не уверены. Сценарий createuser сам запросит все недостающие данные — имя пользователя, право создания баз данных и пользователей PostgreSQL. В листинге 10.5 приведен пример использования сценария createuser в интерактивном режиме. При этом выполняются те же действия, как при однострочном вызове в листинге 10.4. Листинг 10.5. Интерактивное создание пользователя сценарием createuser [jworsley@booktown -]$ createuser Enter name of user to add: newuser Shall the new user be allowed to create databases? (y/n) n Shall the new user be allowed to create more new users? (y/n) n CREATE USER Модификация пользователей Существующие учетные записи пользователей могут изменяться только суперпользователями PostgreSQL. При этом допускается изменение всех параметров, указываемых при создании пользователя (пароль, срок действия, глобальные права), кроме системного идентификатора. Модификация существующих пользователей производится командой SQL ALTER USER. Синтаксис команды ALTER USER: ALTER USER пользователь [ WITH PASSWORD 'пароль' ] [ CREATEDB NOCREATEDB ] [ CREATEUSER NOCREATEUSER ] [ VALID UNTIL 'срок' ] Обязательный аргумент пользователь определяет пользователя, параметры которого требуется изменить. Ниже перечислены необязательные параметры команды.
Команда ALTER USER часто используется для изменения пароля и/или срока действия пароля. Если срок действия пароля, заданного при создании пользователя, истек, а пользователь требует парольной аутентификации, суперпользователю придется изменить пароль и срок его действия, чтобы пользователь смог снова подключиться к базе. Если срок действия пароля не ограничивается, воспользуйтесь специальным значением infinity. . В листинге 10.6 изменяются параметры пользователя salesuser. Секция WITH PASSWORD назначает пароль n3Wp4s4, а секция VALID UNTIL указывает, что этот пароль действует до 1 января 2003 года. Листинг 10.6. Изменение пароля tempiatel=# ALTER USER salesuser tempiatel-# WITH PASSWORD 'n3WP4s4' tempiatel-# VALID UNTIL '2003-01-01': ALTER USER Иногда пользователю требуется предоставить дополнительные права помимо тех, которые предоставлены ему при создании. Ключевое слово CREATEUSER в листинге 10.7 изменяет права пользователя sal esuser и превращает его в суперпользователя. При этом отдельное назначение права CREATEDB становится излишним, поскольку это право предоставляется суперпользователям автоматически. Листинг 10.7. Предоставление прав суперпользователя tempiatel=# ALTER USER salesuser tempiatel-# CREATEUSER; ALTER USER Возможна и обратная ситуация — когда требуется отобрать у пользователя права, предоставленные ему в прошлом. Задача легко решается суперпользователем при помощи ключевых слов NOCREATEDB или NOCREATEUSER (листинг 10.8). Листинг 10.8. Отзыв прав суперпользователя tempiatel=# ALTER USER salesuser tempiatel-# NOCREATEDB NOCREATEUSER; ALTER USER ВНИМАНИЕ Суперпользователи могут лишать прав других суперпользователей и даже удалять их, поэтому предоставление права CREATEUSER требует чрезвычайной осторожности. Удаление пользователей Аутентифшщрованный суперпользователь может в любой момент удалить из системы любого пользователя PostgreSQL. Существует единственное ограничение — нельзя удалить пользователя, который является владельцем базы данных. Прежде чем удалять пользователя, необходимо удалить из системы принадлежащие ему базы. Задача удаления пользователей PostgreSQL, как и их создание, решается двумя способами. Вы можете воспользоваться командой SQL DROP USER и приложением командной строки dropuser. Удаление пользователей командой SQL DROP USER Чтобы удалить пользователя PostgreSQL, суперпользователь может ввести команду DROP USER в любом клиенте. Чаще всего для этого применяется клиент psql. Синтаксис команды DROP USER: DROP USER пользователь Параметр пользователь определяет имя пользователя, удаляемого из системы. В листинге 10.9 клиент psql подключается к PostgreSQL с именем пользователя manager и удаляет пользователя salesuser. Листинг 10.9. Удаление пользователя командой DROP USER [jworsley@booktown -]$ psql -U manager template! Welcome to psql. the PostgreSQL interactive terminal. Type: \copyright for distribution terms \h for help with SQL commands \? for help on internal slash commands \g or terminate with semicolon to execute query \q to quit tempiatel=# DROP USER salesuser: DROP USER Сообщение DROP USER, выданное сервером, означает, что пользователь был успешно удален из системы. Также возможны сообщения об ошибках.
Удаление пользователей при помощи сценария dropuser Сценарий dropuser имеет много общего со сценарием createuser. Он поддерживает те же параметры подключения, что позволяет запускать его как в локальном, так и в удаленном режиме. Единственным обязательным аргументом является имя пользователя, удаляемого из системы. Синтаксис командной строки приложения dropuser: dropuser [ параметры ] [ пользователь ] Ключи, входящие в строку параметров, были описаны в пункте «Создание пользователей при помощи сценария createuser» подраздела «Создание пользователей» этого раздела. В листинге 10.10 приложение dropuser выполняет ту же операцию, которая выполнялась командой SQL из листинга 10.9, — пользователь manager удаляет из системы пользователя salesuser. Листинг 10.10. Удаление пользователя приложением dropuser [jworsley@booktown -]$ dropuser -U manager salesuser DROP USER Приложение dropuser выводит те же сообщения, что и команда SQL DROP USER. Если при выполнении сценария dropuser в командной строке отсутствует имя удаляемого пользователя, оно запрашивается в интерактивном режиме. |
![]() |
![]() |
![]() |