Bir izin kodu kullanıcının bir ucu çağırıp çağıramayacağına karar verir. İki ince katman da kullanıcının yanıtta neyi göreceğine karar verir. core/field_access.py içindeki alan erişimi, çağıranın taşımadığı bir izin kodu isteyen metadata alanlarının değerlerini kaldırır. core/row_scope.py içindeki satır erişimi ve core/rls.py içindeki veritabanı yedeği, kişisel kayıtları sahibine ve sahibin ekibine sınırlar. Değişiklik geçmişinin core/sensitive_fields.py içindeki değer gizlemesi üçüncü, ayrı bir mekanizmadır; değişiklik geçmişi sayfasında belgelenir.
Kısaca¶
- Bir
FieldMetabirpermissionadlandırabilir; o zaman alanın değeri yalnızca o kodu taşıyan çağıranlara ulaşır (src/cluster_erp/core/field_access.py:1-13,src/cluster_erp/core/metadata.py:115-119). redact_restrictedbir yanıtta izinli alanları boşaltır,drop_restricted_inputgelen yükten çıkarır (src/cluster_erp/core/field_access.py:48-72).build_scopeüç kapsamdan birini döndürür:<entity>.read_allsahibi için tüm satırlar, aksi hâlde çağıranın kendi tarafı artı geçişli ekibi, çağıranın tarafı yoksa hiçbir satır (src/cluster_erp/core/row_scope.py:62-83).apply_scopesahip sütununa birINsüzgeci ekler; boş bir kapsam boş sonuç verir, asla tüm satırları vermez (src/cluster_erp/core/row_scope.py:92-109).- İki tablo, aynı kapsamdan yayımlanan işlem yerel bir ayarı okuyan bir veritabanı satır politikası taşır (
migrations/versions/rls01_crown_jewel_rls_backstop.py:32-48,src/cluster_erp/core/rls.py:1-23).
Nasıl çalışır¶
Alan erişimi¶
restricted_fields bir EntityMeta nesnesinin form alan gruplarını, iç içe item_fields dahil gezer ve her alan anahtarını izin koduyla döndürür (src/cluster_erp/core/field_access.py:24-41). denied_fields kodu çağıranda olmayan anahtarları tutar (src/cluster_erp/core/field_access.py:44-45). Çağıranın yüklemi, çağıranın izin kümesi üzerinde allowed_from_codes ile kurulur; diğer modüller bu kümeyi modules/auth/guards.py içindeki actor_allowed veya permission_codes_for ile alır (src/cluster_erp/core/field_access.py:75-77, src/cluster_erp/modules/auth/guards.py:170-186).
Bu commit'teki kullanıcılar, redact_restricted ve drop_restricted_input için grep ile bulundu:
| Çağıran | Kullanım | Kaynak |
|---|---|---|
| Çalışan uçları | Yaratma ve güncellemede izinli girdiyi atar, izinli çıktıyı boşaltır | src/cluster_erp/modules/owned_organisations/employees/routes.py:57-112 |
| Taraf bileşik ucu | İzinli çalışan girdisini atar | src/cluster_erp/server/routes/party_composite.py:118-119 |
| Taraf rolleri ucu | İzinli çalışan girdisini atar | src/cluster_erp/server/routes/party_roles.py:118 |
Kodda bildirilen izinli alanlar employee.read_sensitive kodunu kullanır: modules/owned_organisations/organisations/metadata.py içinde altı bildirim (örneğin 462-500. satırlardaki tax_no, national_id_no, social_security_no ve blood_group) ve modules/parties/parties/metadata.py içinde altı bildirim (grep ile sayıldı). Kiracı tanımlı alanların redact_extra üzerinden kendi izin kapısı vardır; bkz. kiracı alanları.
Satır kapsamı¶
row_scope saf bir modüldür. Yalnızca uuid ve SQLAlchemy Core'a dayanır; veriyi çağıran sağlar (src/cluster_erp/core/row_scope.py:15-21).
| Çağıran durumu | Ortaya çıkan Scope |
Kaynak |
|---|---|---|
<entity>.read_all taşır |
all_access=True, süzgeç yok |
src/cluster_erp/core/row_scope.py:78-79 |
| Taraf çözülemez | Boş taraf kümesi, hiçbir şey görmez | src/cluster_erp/core/row_scope.py:80-81 |
| Taraf çözülür | Kendi tarafı artı geçişli ekip | src/cluster_erp/core/row_scope.py:82-83 |
Scope.may_see tek bir kayda karar verir; Scope.restrict bir sorgu için listeyi döndürür (src/cluster_erp/core/row_scope.py:46-59). deny_all açık boş kapsamdır (src/cluster_erp/core/row_scope.py:86-89).
Bu commit'te kullanan modül intranet'tir. modules/intranet/access.py içindeki resolve_scope, read_all kodunu denetler, çağıranın tarafını ve ekibini çözer, kapsamı kurar ve veritabanına yayımlar (src/cluster_erp/modules/intranet/access.py:189-219). read_all kodları tohum listesindedir: intranet_leave_request, intranet_leave_balance, intranet_request, intranet_official_delivery, intranet_notification, intranet_content, intranet_kudos ve intranet_event (src/cluster_erp/server/app.py:808-825).
Veritabanı yedeği¶
Dizi, çözülmüş bir kapsamın veritabanına nasıl ulaştığını gösterir.
sequenceDiagram participant S as resolve_scope participant B as build_scope participant P as publish_scope participant DB as PostgreSQL satır politikası S->>B: has_read_all, self_party, team B-->>S: Scope S->>P: Scope P->>DB: işlem yerel set_config, RLS_PARTIES_GUC DB-->>DB: satırlar party_id ile süzülür
Düz anlatımla: resolve_scope girdileri hesaplar ve build_scope çağırır (src/cluster_erp/modules/intranet/access.py:207-218). publish_scope izin verilen tarafları veya sınırsız işaretini, RLS_PARTIES_GUC ile adlandırılan işlem yerel bir PostgreSQL ayarına yazar (src/cluster_erp/core/rls.py:37-60, src/cluster_erp/modules/intranet/access.py:219). rls01 göçü intranet_official_deliveries ve intranet_notifications tablolarında satır düzeyi güvenliği açar ve zorlar; politika her satırın party_id değerini bu ayarla karşılaştırır (migrations/versions/rls01_crown_jewel_rls_backstop.py:32-48). Ayarlanmamış veya boş bir ayar hiçbir satır vermez (src/cluster_erp/core/rls.py:3-9). rls_span ayarı korunan tek bir işlem için genişletir veya daraltır ve sonra önceki değeri geri koyar (src/cluster_erp/core/rls.py:79-105).
Neden böyle kurulmuştur¶
- Alan erişimi açıklaması amacı söyler: tek bir metadata bildirimi web istemcisinin alanı gizlemesini ve API'nin onu ayıklamasını sağlar; böylece
employee.readartık çalışanın hassas tanımlayıcılarını açığa çıkarmaz (src/cluster_erp/core/field_access.py:3-13). - Satır kapsamı açıklaması, şirket yalıtımının fiziksel olduğunu (kiracı başına bir veritabanı) ve satır kapsamının tek bir şirket içinde, tasarım gereği kapalı başarısız olan yetkilendirme olduğunu söyler (
src/cluster_erp/core/row_scope.py:1-13). - RLS açıklaması uygulama kapsamının birincil denetim kaldığını, veritabanı politikasının
apply_scopeçağırmayı unutan bir sorgu için yedek olduğunu söyler (src/cluster_erp/core/rls.py:11-17).
Kurallar ve sınırlar¶
apply_scopeerişimi asla genişletemez: boş bir izin kümesiIN ()olur (src/cluster_erp/core/row_scope.py:97-109).- RLS ayarı işlem yereldir; havuzlanmış bağlantılar arasında sızmaz (
src/cluster_erp/core/rls.py:19-23). publish_all, kendi yetkilendirmesi sistem düzeyinde bir hakkı zaten kurmuş yollara ayrılmıştır; örneğin saklama temizliği veyaread_allile korunan yüzeyler (src/cluster_erp/core/rls.py:72-76).tests/test_row_scope.py(10 test) kapsam politikasını,tests/test_authz_conformance.py(6 test) katmanlı modeli sabitler (grep -c "def test_"ile sayıldı).
Diğer parçalarla etkileşim¶
read_allveread_sensitivearkasındaki izin kodları sıradan kodlardır; bkz. roller ve izinler.- Kaynak öznitelikli politikalar üçüncü, kayıt düzeyinde bir daraltmadır; bkz. ABAC politikaları.
- Intranet erişim yardımcıları intranet erişimi, hedef kitle ve saklama sayfasında belgelenir.
Sınırlar ve açık noktalar¶
- Bu commit'te
row_scopeverlsyalnızca intranet kodundan çağrılır (src/cluster_erpüzerindebuild_scope,apply_scopevepublish_scopeiçingrep). Diğer kişisel kayıtların kodda satır kapsamı yoktur. redact_restrictedbir Pydantic modelinde öznitelikleri boşaltır, bir sözlükten anahtarları kaldırır; izinli alanları olan bir varlığın her liste ucunun bunu uygulayıp uygulamadığı, yukarıdaki üç çağıran dışında koddan belirlenemedi.
Tanıtılan terimler¶
| Terim | Kod tanımlayıcısı | Tanım | Türkçe terim | Kaynak |
|---|---|---|---|---|
| gated field | FieldMeta.permission |
Değeri yalnızca adlandırılmış bir izin kodunu taşıyanlara ulaşan metadata alanı. | izinli alan | src/cluster_erp/core/metadata.py:115 |
| row scope | Scope |
Bir çağıranın kayıtlarını görebileceği taraflar kümesi. | satır kapsamı | src/cluster_erp/core/row_scope.py:35 |
| read-all code | read_all |
Bir varlık için satır kapsamını kaldıran izin eylemi. | tümünü okuma kodu | src/cluster_erp/server/app.py:811 |
| row-level security backstop | RLS_PARTIES_GUC |
İki kişisel tabloyu yayımlanan taraf kümesine göre süzen veritabanı satır politikası. | satır düzeyi güvenlik yedeği | src/cluster_erp/core/rls.py:37 |
İlgili sayfalar¶
- Kimlik, erişim, kiracılık, gizlilik ve lisans
- Roller ve izinler
- ABAC politikaları
- Değişiklik geçmişi
- Metadata modeli
92f8051 numaralı commit ile 2026-11-13 tarihinde doğrulandı.