Хэрэглэгч ба эрх
Бодит системд өгөгдлийн санд нэг хүн л холбогддоггүй — хөгжүүлэгчид, read-only тайлангийн хэрэгслүүд, автомат backup систем, application server гэх мэт олон тал байдаг. Тус бүрд зөвхөн шаардлагатай эрхийг олгох нь аюулгүй байдлын үндэс юм. PostgreSQL-д энэ зорилгоор role ашигладаг.
Role гэж юу вэ?
PostgreSQL-д хэрэглэгч болон бүлэг хоёулаа ROLE юм. LOGIN эрхтэй role нь нэвтрэх боломжтой хэрэглэгч болдог.
-- Нэвтрэх эрхтэй хэрэглэгч үүсгэх
CREATE ROLE app_user LOGIN PASSWORD 'нууцүг123';
-- Нууц үггүй, зөвхөн бүлгийн role
CREATE ROLE readonly;
-- Хэрэглэгч устгах
DROP ROLE app_user;
-- Байгаа role-уудыг харах
SELECT rolname, rolcanlogin, rolsuper
FROM pg_roles
WHERE rolname NOT LIKE 'pg_%'
ORDER BY rolname;
GRANT — эрх олгох
GRANT командаар тодорхой объектод эрх олгоно:
-- readonly role-д бүх хүснэгтийг унших эрх
GRANT SELECT ON ALL TABLES IN SCHEMA public TO readonly;
-- app_user-д зөвхөн тодорхой хүснэгтэд бичих эрх
GRANT SELECT, INSERT, UPDATE ON employees TO app_user;
GRANT SELECT, INSERT, UPDATE ON departments TO app_user;
-- sequence ашиглах эрх (SERIAL-д шаардлагатай)
GRANT USAGE, SELECT ON ALL SEQUENCES IN SCHEMA public TO app_user;
-- app_user-д readonly бүлгийн эрхийг нэмэх
GRANT readonly TO app_user;
-- Шинэ хүснэгт үүсгэх үед автоматаар эрх олгох
ALTER DEFAULT PRIVILEGES IN SCHEMA public
GRANT SELECT ON TABLES TO readonly;
ALTER DEFAULT PRIVILEGES IN SCHEMA public
GRANT SELECT, INSERT, UPDATE ON TABLES TO app_user;
ALTER DEFAULT PRIVILEGES нь ирээдүйд үүсгэгдэх хүснэгтэд автоматаар эрх тавьдаг тул гараар давтан GRANT хийх шаардлагагүй болдог.
REVOKE — эрх хасах
-- Тодорхой эрхийг хасах
REVOKE INSERT, UPDATE ON employees FROM app_user;
-- Бүх эрхийг хасах
REVOKE ALL ON employees FROM app_user;
-- Бүлгийн эрхийг хасах
REVOKE readonly FROM app_user;
Хэрэглээний жишээ — олон давхаргат эрх
Бодит системд ихэвчлэн эрхийн давхарга тавьдаг:
-- 1. Бүлгийн role-уудыг үүсгэх
CREATE ROLE readonly;
CREATE ROLE readwrite;
CREATE ROLE admin_role;
-- 2. Бүлэгт эрх олгох
GRANT SELECT ON ALL TABLES IN SCHEMA public TO readonly;
GRANT SELECT, INSERT, UPDATE, DELETE ON ALL TABLES IN SCHEMA public TO readwrite;
GRANT USAGE, SELECT ON ALL SEQUENCES IN SCHEMA public TO readwrite;
GRANT ALL ON ALL TABLES IN SCHEMA public TO admin_role;
GRANT ALL ON ALL SEQUENCES IN SCHEMA public TO admin_role;
-- 3. Бодит хэрэглэгчдийг үүсгэж бүлэгт нэгтгэх
CREATE ROLE report_bot LOGIN PASSWORD 'pass1';
CREATE ROLE backend_app LOGIN PASSWORD 'pass2';
CREATE ROLE dba_john LOGIN PASSWORD 'pass3';
GRANT readonly TO report_bot;
GRANT readwrite TO backend_app;
GRANT admin_role TO dba_john;
-- Хэрэглэгчийн эрхийг шалгах
SELECT grantee, table_name, privilege_type
FROM information_schema.role_table_grants
WHERE grantee = 'backend_app'
ORDER BY table_name, privilege_type;
Хэрэглэгч тус бүрд шууд эрх олгохоос илүүтэй бүлгийн role-д эрх тавьж, хэрэглэгчдийг тухайн бүлэгт нэмэх нь удирдахад хамаагүй хялбар.
Row Level Security (RLS)
PostgreSQL нь мөр тус бүрийн эрхийг (RLS) дэмждэг — Supabase үүнийг идэвхлэн ашигладаг:
ALTER TABLE employees ENABLE ROW LEVEL SECURITY;
-- Хэрэглэгч зөвхөн өөрийн хэлтсийнхийг харна
CREATE POLICY dept_isolation ON employees
FOR SELECT
USING (department_id = current_setting('app.current_dept_id')::INT);
Дараагийн хичээлд:
PostgreSQL-д JSON ба JSONB өгөгдлийн төрлийг хэрхэн хадгалж, хайж, шинэчлэх — уян хатан бүтэцгүй өгөгдлийг SQL дотор ажиллуулах аргыг сурна.