Өгөгдөл ба RLS¶
Өгөгдлийн давхарга нь PostgreSQL 16 + pgvector, ORM-гүй. Бүх query гар
бичмэл, параметржүүлсэн; бичлэгүүд нь pgx.RowToStructByName-ээр уншигдах
энгийн struct.
Row-Level Security¶
RLS бол платформын хэрэглэгч тус бүрийн тусгаарлалтын гол хил — repository
аль хэдийн бичдэг WHERE user_id = … нөхцлийн доорх defense-in-depth. Query-ийн
алдаа гарсан ч өөр хэрэглэгчийн мөр буцаж чадахгүй.
Гурван identity¶
Context дээр Identity{ UserID, Role } зөөгддөг. Role нь SQL policy-ийн
литералтай яг таарах гурван утгын нэг:
| Role | Хэн тавьдаг | Хамрах хүрээ |
|---|---|---|
service |
/auth бүлгийн ServiceRLSContext |
Нэвтрэхээс өмнөх / системийн урсгал (eID upsert, refresh identity хайлт, bootstrap). Бүрэн эрх |
admin |
Auth middleware, admin JWT дээр | Бүх мөрд бүрэн хандалт |
user |
Auth middleware, энгийн JWT дээр | Зөвхөн дуудагчийн өөрийн мөр |
Repository-ийн withRLS(ctx, fn) туслах нь query бүрийг транзакцид боож,
identity-г session хувьсагчаар нийтэлдэг. Тиймээс policy нь дуудагчийг мэдэж
байдаг.
RLS үйлчилдэг хүснэгтүүд¶
users organizations organization_memberships
gov_applications gov_application_events gov_references
gov_notifications gov_payments gov_appointments
user_integrations user_recovery_codes security_events
superadmin_accounts sso_tokens audit_log
oauth_consents oauth_access_tokens oauth_auth_codes
gov_* хүснэгтүүд дээр дөрөв дэх policy — officer — байдаг: gov.review
эрхтэй албан хаагч өөрт хуваарилагдсан хүсэлтийн мөрийг харна.
API нь superuser-ээр холбогдож БОЛОХГҮЙ
RLS нь BYPASSRLS эсвэл table owner дээр үйлчлэхгүй. Тиймээс апп нь
хамгийн бага эрхтэй role-оор холбогдоно, ба production дээр boot guard нь
үүнийг шалгаж, зөрчилтэй бол асахаас татгалзана.
Шинэ хүснэгт нэмэхэд¶
Хэрэглэгч тус бүрийн өгөгдөл хадгалдаг шинэ хүснэгт бүрд өөрийн policy хэрэгтэй:
ALTER TABLE my_table ENABLE ROW LEVEL SECURITY;
CREATE POLICY my_table_service ON my_table
USING (current_setting('app.role', true) = 'service');
CREATE POLICY my_table_admin ON my_table
USING (current_setting('app.role', true) = 'admin');
CREATE POLICY my_table_self ON my_table
USING (user_id::text = current_setting('app.user_id', true));
Гол хүснэгтүүд¶
| Хүснэгт | Юу хадгалдаг |
|---|---|
users |
Иргэн — civil_id-ээр түлхүүрлэсэн; role_id, токен цуцлалтын cutoff |
roles · permissions · role_permissions |
Динамик RBAC каталог |
superadmin_accounts · superadmin_invites |
Super admin данс (тусдаа), урилгын allow-list |
user_recovery_codes |
TOTP сэргээх кодууд (hash) |
login_events |
Нэвтрэлтийн түүх, lockout тооцоо |
| Хүснэгт | Юу |
|---|---|
organizations |
Байгууллага — улсын бүртгэлээс лавласан мэдээлэл |
organization_memberships |
Гишүүнчлэл + үүрэг |
org_stamps |
Байгууллагын тамганы зураг |
| Хүснэгт | Юу |
|---|---|
gov_services · gov_life_events |
Каталог |
gov_applications · gov_application_events |
Хүсэлт + түүний timeline |
gov_references |
Олгосон лавлагаа |
gov_notifications · gov_payments · gov_appointments |
Мэдэгдэл, төлбөр, цаг |
gov_service_events |
Үйлчилгээний түвшний үйл явдал |
| Хүснэгт | Юу |
|---|---|
registry_services · registry_service_versions |
Үйлчилгээний паспорт + хувилбар |
registry_evidences · registry_service_evidences |
Нотолгооны каталог, холбоос |
registry_life_events |
Амьдралын үйл явдал |
relay_platforms · relay_routes |
Доод байгууллага, чиглүүлэлт |
relay_requests · relay_assignments · relay_events |
Дамжуулсан хүсэлт, хуваарилалт, түүх |
| Хүснэгт | Юу |
|---|---|
gateway_services · gateway_request_logs |
Service catalog + телеметр |
applications · application_services |
RP бүртгэл, service олголт |
oauth_clients · oauth_consents |
OIDC client, зөвшөөрөл |
oauth_auth_codes · oauth_access_tokens · oauth_challenges |
Урсгалын түр төлөв |
admin_api_keys · developer_apps |
Admin key, хөгжүүлэгчийн апп |
| Хүснэгт | Юу |
|---|---|
ai_prompts |
Админ засварладаг scope / instructions prompt давхарга |
ai_knowledge |
Мэдлэгийн сангийн корпус + pgvector embedding (HNSW индекс) |
themes · site_appearance |
Нэрлэсэн theme, сайт-даяарх харагдац |
platform_settings |
Платформын түлхүүр-утга тохиргоо |
audit_log |
Hash-chain холбоост, зөвхөн-нэмэх бүртгэл |
Migration¶
- Файл нэр:
N_name.up.sql+N_name.down.sql,platform-core/migrations/-д. - Go binary-д
embedхийгддэг тул контейнерт SQL файл хуулах шаардлагагүй. - Compose-ийн
migrateүйлчилгээupбүрд ажиллана — хэрэгжсэнийг алгасна. - Дугаарлалтын муж: аппын өөрийн migration нь суурийн мужаас гадуур байна
(
migrations/RANGE) — эс бөгөөс дугаар мөргөлдөнө.
Мэдлэгийн санг засварлахад
ai_knowledge-ийн корпус migration 48-д. Бүлгийн slug-ийг хэвээр
хадгал — embedding нь boot дээр эсвэл
POST /api/v1/admin/ai/knowledge/reindex-ээр шинэчлэгдэнэ.
Холболтын удирдлага¶
| Тохиргоо | Юу |
|---|---|
DB_MAX_OPEN_CONNS |
Pool-ийн дээд хэмжээ |
DB_MAX_IDLE_CONNS |
Сул холболтын тоо |
DB_CONN_MAX_LIFE_MINS |
Холболтын нас |
pgx pool нь otelpgx-ээр trace хийгддэг тул удаан query нь trace дээр харагдана.