GitHub

Ограничение доступа пользователей по времени

Андрей Аксенов

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