Skip to content

Yetki Tenant ve Sahiplik

Cavanshirpro edited this page Sep 19, 2026 · 1 revision

RBAC, tenant ve satır sahipliği

English · Türkçe · Languages / Diller

Kapsam: JSON API Forge 0.5.1 · İnceleme: 17 Eylül 2026 · Dil: Türkçe

Kimlik doğrulama çağıranın kim olduğunu, yetkilendirme hangi işlemi hangi veri üzerinde yapabileceğini belirler. Forge principal'ı kimlik türü, subject, roller, izinler ve isteğe bağlı tenant bilgisini taşır.

Roller ve izinler

{
  "roles": {
    "reader": {"permissions": ["notes.list", "notes.read"]},
    "writer": {"inherits": ["reader"], "permissions": ["notes.create", "notes.update"]}
  }
}

İzin adlarını iş sözleşmenizin parçası olarak sürümleyin. notes.* veya * geniş kapsamlıdır. Role inheritance geçişlidir; döngü ve bilinmeyen roller doğrulama konusu olur. Endpointin permission alanını boş bırakmak public yapmak için genel yöntem değildir; destekleyen endpoint türünde açık public=true gerekir.

Satır politikası

Bir kaynakta tenant_field principal'ın tenant değerini, owner_field principal subject'ini kullanır. Örneğin:

{
  "tenant_field": "tenant_id",
  "owner_field": "owner_id",
  "owner_actions": ["list", "read", "update", "delete"],
  "owner_bypass_permission": "notes.owner.bypass"
}

Bu bir resource'a eklenecek parçadır, tek başına tam resource değildir. İlgili kolonların şemada var olması gerekir. Tenant/owner/soft-delete alanlarını writable_fields listesinden çıkarın; istemcinin body içindeki tenant_id değerini yetki kaynağı kabul etmeyin.

Tenant alanı yapılandırılmışsa gerekli tenant bilgisi bulunmayan principal'ın erişimi engellenir. Owner ile tenant farklı soruları cevaplar: "hangi müşterinin verisi?" ve "hangi kimliğin kaydı?". İkisi birlikte kullanılabilir.

SQL ve custom endpoint sınırı

Generic CRUD'un otomatik row politikası, sizin yazdığınız bütün SQL metinlerine veya hook koduna kendiliğinden eklenmez. RPC'de gerekiyorsa:

{
  "sql": "UPDATE notes SET title = :title WHERE id = :id AND tenant_id = :tenant AND owner_id = :owner",
  "mode": "execute",
  "params": {
    "id": "$body.id", "title": "$body.title",
    "tenant": "$principal.tenant_id", "owner": "$principal.subject"
  },
  "require_rowcount_min": 1,
  "require_rowcount_max": 1
}

Bu statement örneği uygun tablo, giriş şeması ve operation izni gerektirir. Tenant/owner'ı body'den almak aynı güven sınırını sağlamaz.

Test edilmesi gereken dört durum

  1. İzinli principal kendi tenant ve kendi kaydını okuyup değiştirebilir.
  2. Aynı role sahip başka tenant o satırı göremez.
  3. Aynı tenant içindeki farklı owner beklenen kısıtlamaya tabidir.
  4. Bypass izni sadece açıkça verilen kimlikte çalışır; cache sonucu farklı kullanıcıya taşınmaz.

Görünmeyen satırlar için 404, izin yetersizliğinde 403 gibi davranışları gerçek endpoint üzerinden test edin. Editör rol sistemi ayrı rank/kapsam modelidir; ekip rehberi ile karıştırmayın.

Kaynak ve doğrulama

Bu sayfa aşağıdaki sabit commitlerdeki davranışı açıklar. Yeni bir sürümde aynı davranışın sürdüğünü varsaymayın.


Wiki ana sayfa · Tüm sayfalar · Sürüm ve bakım

Clone this wiki locally