Ограничение доступа пользователей по времени
Greengage DB позволяет ограничить доступ для заданных ролей в определенные дни или временные интервалы. Например, вы можете применить одно из следующих ограничений:
-
Запретить доступ в субботу и воскресенье.
-
Запретить доступ с 22:00 субботы до 08:00 воскресенья.
Обзор
Для ограничения доступа по времени используются атрибуты роли DENY
и DENY BETWEEN
:
-
DENY
задает день, в который доступ запрещен. -
DENY BETWEEN
задает интервал, в течение которого доступ запрещен.
Ограничения по времени, заданные с использованием этих атрибутов, применяются при входе пользователя в систему. Например, если пользователь пытается подключиться к базе данных в запрещенный период, возникает следующая ошибка:
FATAL: authentication failed for user "alice": login not permitted at this time
Есть несколько особенностей, связанных с ограничениями по времени:
-
Ограничения по времени не наследуются и применяются только к роли, которой они назначены.
-
Команды
SET ROLE
иSET SESSION AUTHORIZATION
не затрагиваются временными ограничениями. -
Аутентификация по времени использует время сервера и не учитывает часовые пояса.
Добавление и удаление временны́х ограничений
Чтобы выполнить примеры из этой статьи, создайте роль с атрибутом LOGIN
:
CREATE ROLE alice WITH LOGIN;
Ограничение доступа в определенные дни
Существует два способа задать день при создании ограничения по времени:
-
Используя название дня, например,
Saturday
илиSunday
. -
Используя номер дня: от 0 (
Sunday
) до 6 (Saturday
).
Данный пример показывает, как запретить доступ в выходные дни:
ALTER ROLE alice
DENY DAY 'Saturday'
DENY DAY 'Sunday';
ALTER ROLE alice
DENY DAY 6
DENY DAY 0;
Чтобы удалить ограничения по времени, используйте выражение DROP DENY FOR
.
ALTER ROLE alice
DROP DENY FOR DAY 'Saturday'
DROP DENY FOR DAY 'Sunday';
ALTER ROLE alice
DROP DENY FOR DAY 6
DROP DENY FOR DAY 0;
Результат должен выглядеть следующим образом:
NOTICE: dropping DENY rule for "alice" between Saturday 00:00:00 and Saturday 24:00:00 NOTICE: dropping DENY rule for "alice" between Sunday 00:00:00 and Sunday 24:00:00
Ограничение доступа в определенный период
Для задания интервала, в течение которого доступ запрещен, используйте ключевые слова BETWEEN
и AND
:
ALTER ROLE alice
DENY BETWEEN DAY 'Friday' AND DAY 'Saturday';
Чтобы убрать ограничение по времени для такого интервала, используйте DROP DENY FOR
для любого дня, который входит в этот интервал:
ALTER ROLE alice
DROP DENY FOR DAY 'Friday';
Результат должен выглядеть так:
NOTICE: dropping DENY rule for "alice" between Friday 00:00:00 and Saturday 24:00:00
Обратите внимание, что интервалы не могут выходить за пределы субботы. Например, невозможно запретить доступ в выходные дни, используя данный синтаксис:
ALTER ROLE alice
DENY BETWEEN DAY 'Saturday' AND DAY 'Sunday';
Ограничение доступа по времени суток
Чтобы задать время суток, используйте ключевое слово TIME
.
Вы можете задать время в 24-часовом или 12-часовом формате, например, TIME '14:00'
или TIME '02:00 PM'
.
Пример ниже показывает, как задать интервалы времени, в течение которых доступ запрещен:
ALTER ROLE alice
DENY BETWEEN DAY 'Saturday' TIME '02:00' AND DAY 'Saturday' TIME '06:00'
DENY BETWEEN DAY 'Sunday' TIME '02:00' AND DAY 'Sunday' TIME '14:00';
ALTER ROLE alice
DENY BETWEEN DAY 'Saturday' TIME '02:00 AM' AND DAY 'Saturday' TIME '06:00 AM'
DENY BETWEEN DAY 'Sunday' TIME '02:00 AM' AND DAY 'Sunday' TIME '02:00 PM';
Чтобы удалить ограничения по времени, используйте выражение DROP DENY FOR
для соответствующих дней:
ALTER ROLE alice
DROP DENY FOR DAY 'Saturday'
DROP DENY FOR DAY 'Sunday';
Результат может выглядеть так:
NOTICE: dropping DENY rule for "alice" between Saturday 02:00:00 and Saturday 06:00:00 NOTICE: dropping DENY rule for "alice" between Sunday 02:00:00 and Sunday 14:00:00