====== Приклад створення системи ролей для нового застосунку ======
===== Опис =====
На початку маємо інстанс Постгреса //mydb//. Для нового проєкту створюємо нову базу даних в цьому інстансі, і двох користувачів: //example_migrator// може робити все в цій БД, а //example_user// може читати та писати в таблиці БД.
Тільки //example_migrator// має створювати нові схеми, таблиці, функції в цій БД! Користувач //example_user// може лише додавати, модифікувати та видаляти записи в таблицях.
===== Створення користувачів =====
CREATE ROLE example_migrator WITH PASSWORD 'putsecrethere' NOSUPERUSER NOCREATEDB LOGIN;
CREATE ROLE example_user WITH PASSWORD 'putsecrethere' NOSUPERUSER NOCREATEDB LOGIN;
===== Створення бази даних та призначення прав =====
наступні операції виконати під адміном, наприклад, //rds_superuser//:
GRANT example_migrator TO CURRENT_USER WITH ADMIN option;
CREATE DATABASE exampledb WITH OWNER example_migrator;
GRANT CONNECT ON DATABASE exampledb TO example_user;
ALTER DEFAULT PRIVILEGES FOR ROLE example_migrator GRANT USAGE ON SCHEMAS TO example_user;
ALTER DEFAULT PRIVILEGES FOR ROLE example_migrator GRANT SELECT, INSERT, UPDATE, DELETE ON TABLES TO example_user;
REVOKE example_migrator from CURRENT_USER;
Це створить нову БД //exampledb//. Користувач //example_migrator// стане її оунером і тому матиме всі права. Користувачу //example_user// надається право на підключення до нової БД, а також право модифікувати записи в усіх майбутніх таблицях і підключатися до всіх майбутніх схем цієї БД
===== Додавання нових користувачів пізніше =====
Після цього через деякий час (вже створені якісь таблиці) може знадобитися додати нового користувача, тільки для читання (хай це буде користувач //dbuser2//):
GRANT example_migrator TO CURRENT_USER WITH ADMIN option;
GRANT CONNECT ON DATABASE exampledb TO dbuser2;
ALTER DEFAULT PRIVILEGES FOR ROLE example_migrator GRANT USAGE ON SCHEMAS TO dbuser2;
ALTER DEFAULT PRIVILEGES FOR ROLE example_migrator GRANT SELECT ON TABLES TO dbuser2;
REVOKE example_migrator from CURRENT_USER;
Далі треба перепідключитися до БД //exampledb// і додати права на існуючи таблиці та схеми:
GRANT USAGE ON SCHEMA exampleschema TO dbuser2;
GRANT SELECT ON ALL TABLES IN SCHEMA exampleschema TO dbuser2;