Роль в PostgreSQL может представлять либо отдельного пользователя, либо группу пользователей. Она управляет доступом к базам данных, таблицам, схемам и другим объектам.
Когда создается роль, она по умолчанию не является привязанной к конкретному пользователю или группе, но вы можете назначать ей свойства и права, которые соответствуют вашим задачам.
Отличие ролей от пользователей
А что пользователи? Тут важно не перепутать. В PostgreSQL пользователи тоже считаются ролями, но с особенностью: пользователи всегда имеют возможность входа в систему. То есть каждая роль может быть пользователем, если у нее есть атрибут LOGIN. Если роли нужно просто объединить пользователей в группу или не давать ей возможности входа, можно не добавлять атрибут LOGIN.
Пример:
- Роль с атрибутом
LOGIN= пользователь. - Роль без
LOGIN= группа или "служебная роль".
Создаём роль
Для создания ролей используется команда CREATE ROLE. Синтаксис выглядит следующим образом:
CREATE ROLE <имя_роли> [WITH] [параметры];
Где параметры — это свойства роли, такие как:
LOGIN— возможность входа в базу данных.CREATEDB— возможность создавать базы данных.CREATEROLE— возможность создавать другие роли.SUPERUSER— полный доступ (самые опасные роли, используйте с осторожностью).PASSWORD— пароль для авторизации.
Давате рассмотрим пример создания роли пользователя. Предположим, вы хотите создать пользователя student с правом входа в систему и паролем. Для этого выполните следующий запрос:
CREATE ROLE student WITH LOGIN PASSWORD 'securePassword123';
Эта команда создаст роль с именем student, которая сможет подключаться к базе данных.
Теперь создадим роль teachers, которая будет групповой. Групповая роль не требует атрибута LOGIN, так как пользователи, входящие в группу, будут использовать свои учетные записи.
CREATE ROLE teachers;
Назначение привилегий ролям
Роли в PostgreSQL создаются, чтобы предоставлять или ограничивать доступ к ресурсам. Для этого используются команды GRANT и REVOKE.
Предоставление прав с GRANT
Синтаксис команды:
GRANT <привилегии> ON <объект> TO <роль>;
Давайте создадим таблицу courses и предоставим роль teachers права на чтение и изменение данных в этой таблице.
-- Создаем таблицу
CREATE TABLE courses (
id SERIAL PRIMARY KEY,
name TEXT NOT NULL,
teacher_id INT
);
-- Предоставляем доступ
GRANT SELECT, INSERT, UPDATE ON courses TO teachers;
Теперь все пользователи, входящие в роль teachers, смогут просматривать, добавлять и изменять данные в таблице.
Отзыв прав с REVOKE
Для отзыва прав используется команда REVOKE. Синтаксис:
REVOKE <привилегии> ON <объект> FROM <роль>;
Чтобы запретить группе teachers обновлять данные в таблице courses, выполните команду:
REVOKE UPDATE ON courses FROM teachers;
Иерархия ролей: наследование
Пользователи могут "унаследовать" привилегии от роли-группы для упрощения управления. Это как передача "наследства" от одного пользователя другому.
Ключевое слово INHERIT позволяет роли наследовать привилегии от другой роли. Это поведение включено по умолчанию, но его можно изменить.
Пример:
-- Добавляем пользователя `john` в группу `teachers`
GRANT teachers TO john;
Теперь пользователь john автоматически получит все привилегии, назначенные групповой роли teachers.
Проверим привилегии:
\du john
Если нужно отключить наследование, роль создается с атрибутом NOINHERIT.
CREATE ROLE admin NOINHERIT;
Теперь пользователи в роли admin не смогут по умолчанию пользоваться её привилегиями.
Создание групп ролей для управления доступом
Группы ролей упрощают управление доступом, особенно в крупных проектах. Вместо того чтобы добавлять права каждому пользователю, можно добавить пользователей в группы, а группы наделить нужными привилегиями.
Приведём простой пример групповой роли. Для этого создадим группы:
students— группа для студентов.teachers— группа для преподавателей.
CREATE ROLE students;
CREATE ROLE teachers;
Назначим пользователей группам:
-- Назначить пользователя john в группу students
GRANT students TO john;
-- Назначить пользователя jane в группу teachers
GRANT teachers TO jane;
Теперь, предоставив доступ к таблице группам students и teachers, мы автоматически дадим его всем их членам!
Практическое упражнение
- Создайте таблицу
examsс полями:id: первичный ключ;subject: текст;teacher_id: ID преподавателя.
CREATE TABLE exams (
id SERIAL PRIMARY KEY,
subject TEXT NOT NULL,
teacher_id INT
);
- Создайте группы ролей
studentsиteachers.
CREATE ROLE students;
CREATE ROLE teachers;
- Дайте группе
teachersправа на добавление и изменение данных в таблицеexams.
GRANT INSERT, UPDATE ON exams TO teachers;
- Дайте группе
studentsправа только на чтение данных.
GRANT SELECT ON exams TO students;
- Создайте пользователя
aliceи добавьте её в группуstudents.
CREATE ROLE alice WITH LOGIN PASSWORD 'alicePassword';
GRANT students TO alice;
- Проверьте, какие права имеет
alice, подключившись под её учетной записью.
Теперь вы знакомы с тем, как создавать роли, управлять их привилегиями и упрощать администрирование с помощью групповых ролей. В следующей лекции мы разберем, как настраивать доступ с помощью команд GRANT и REVOKE для более точного управления на уровне баз данных, схем и таблиц.
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ