Factorizer/Cluster ERP WikiCluster ERP English
Ana sayfa / Kimlik ve erişim

Açıklama

Alan ve satır erişimi

core/field_access.py'nin izinli alan değerlerini nasıl gizlediği ve core/row_scope.py ile core/rls.py'nin kişisel kayıtları sahibine ve ekibine nasıl sınırladığı.

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 FieldMeta bir permission adlandı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_restricted bir yanıtta izinli alanları boşaltır, drop_restricted_input gelen yükten çıkarır (src/cluster_erp/core/field_access.py:48-72).
  • build_scope üç kapsamdan birini döndürür: <entity>.read_all sahibi 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_scope sahip sütununa bir IN sü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.read artı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_scope erişimi asla genişletemez: boş bir izin kümesi IN () 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 veya read_all ile 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

Sınırlar ve açık noktalar

  • Bu commit'te row_scope ve rls yalnızca intranet kodundan çağrılır (src/cluster_erp üzerinde build_scope, apply_scope ve publish_scope için grep). Diğer kişisel kayıtların kodda satır kapsamı yoktur.
  • redact_restricted bir 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


92f8051 numaralı commit ile 2026-11-13 tarihinde doğrulandı.

Doğrulanan commit 92f8051 · 2026-11-13