Роли и атрибуты
Роли в PostgreSQL — это механизм управления правами доступа, объединяющий пользователей и группы.
Атрибуты ролей определяют их привилегии (например, возможность входа, создания БД, суперпользовательские права).
Понятие ролей
-
В PostgreSQL нет разделения на "пользователей" и "группы" — только роли.
-
Роль может быть:
-
Пользователем (с атрибутом
LOGIN
). -
Группой (объединяет другие роли для упрощения управления правами).
-
Основные атрибуты ролей
Атрибуты задаются при создании/изменении роли (CREATE ROLE
, ALTER ROLE
):
Атрибут | Описание | Пример SQL |
---|---|---|
LOGIN |
Позволяет войти в СУБД (аналог "пользователя"). | CREATE ROLE dev LOGIN; |
SUPERUSER |
Даёт полный контроль над PostgreSQL (опасно!). | CREATE ROLE admin SUPERUSER; |
CREATEDB |
Позволяет создавать базы данных. | CREATE ROLE dba CREATEDB; |
CREATEROLE |
Позволяет создавать и управлять другими ролями. | ALTER ROLE manager CREATEROLE; |
REPLICATION |
Даёт права на репликацию (для standby-серверов). | CREATE ROLE replicator REPLICATION; |
PASSWORD 'пароль' |
Устанавливает пароль для входа. | CREATE ROLE user1 LOGIN PASSWORD '123'; |
VALID UNTIL 'дата' |
Ограничивает срок действия роли. | ALTER ROLE temp_user VALID UNTIL '2024-12-31'; |
Наследование ролей
Роли могут включать другие роли (INHERIT
), получая их права.
Управление ролями
Создание роли:Практическая часть
Создайте роль developer
с правом входа и паролем.
Создайте роль dba
с правами CREATEDB
и CREATEROLE
.
Создайте роль report_user
с доступом только на чтение (SELECT
).
Создайте роль manager
, которая наследует report_user
и может изменять данные (UPDATE
).
Подключитесь под ролью developer
и попробуйте создать базу данных. Должна быть ошибка.
-
Роли — гибкий инструмент для управления доступом в PostgreSQL.
-
Атрибуты (
LOGIN
,SUPERUSER
,CREATEDB
и др.) определяют возможности роли. -
Наследование упрощает управление правами для групп пользователей.
Рекомендации:
-
Не злоупотребляйте
SUPERUSER
— используйте минимально необходимые права. -
Регулярно аудитируйте роли (
SELECT * FROM pg_roles
).