Ana içeriğe geç

RBAC İzin Matrisi

Zeus 2.0, 77 granüler izin ve 3 önceden tanımlı rol içerir. Her rol, kaynak bazında farklı işlem yetkilerine sahiptir. İzinler ve rol şablonları tek kaynaktan tanımlanır: backend/app/core/security/permissions.py (Permission enum + ROLE_PERMISSIONS).

İzinler iki katmanda uygulanır: (1) Backend — her API isteği izin kontrolünden geçer (yetkisiz istek 403 Forbidden döner); (2) Frontend (UI) — kullanıcının izni olmayan menüler ve butonlar hiç çizilmez. İkinci katman güvenlik değil, kullanıcı deneyimidir (bkz. Frontend (UI) Gating).

Süper yönetici (platform operatörü) izin kontrolünü atlar

Aşağıdaki roller firma (tenant) düzeyi yetkilendirmedir. Platform süper yöneticisi (is_superuser) bu izin kontrolünün dışındadır — tüm platform yetkilerine sahiptir ve firmalar arası (cross-tenant) Sistem Konsolu ekranlarını görür.

Roller

RolAçıklamaİzin Sayısı
AdminTam yetki — tüm CRUD + yönetim işlemleri (mahsuplaşma yapısal yönetim dahil).77
OperatorOkuma + sınırlı yazma (cihaz, gateway, alarm, iletişim) + OSOS senkron tetikleme + mahsuplaşma raporu yükleme.32
ViewerSalt okunur erişim (mahsuplaşma dahil yalnız görüntüleme).16

İzin Matrisi

Aşağıdaki tabloda her kaynak grubu için roller bazında verilen izinler listelenmiştir. Hücredeki kısaltmalar için Kısaltma Açıklamaları bölümüne bakın.

Kaynakİzin TipleriAdminOperatorViewer
Bölgeler (Regions)READ, WRITE, DELETER W DRR
Alt Bölgeler (Subregions)READ, WRITE, DELETER W DRR
Gateway'lerREAD, WRITE, DELETER W DR WR
Cihazlar (Devices)READ, WRITE, DELETE, CONTROL (inverter)R W D CtR WR
Ölçümler (Measurements)READ, EXPORTR ER ER
AlarmlarREAD, WRITE, ACK, CLOSER W A CR W A CR
Alarm PolitikalarıREAD, WRITE, DELETER W DR W
RaporlarREAD, WRITE, DELETE, EXPORTR W D ER ER E
Ödemeler (Payments)READ, WRITE, MANAGE (abonelik)R W Sb
Kullanıcılar (Users)READ, WRITE, DELETER W D
Roller (Roles)READ, WRITE, DELETER W D
Varlıklar (Assets)READ, WRITE, DELETER W DRR
SLD (Tek Hat Şeması)READ, WRITER WRR
LOTOREAD, REQUEST, APPROVE, APPLY, RELEASER Rq Apr Ap RlR Rq ApR
FirmwareREAD, UPLOAD, DELETE
OTAREAD, INITIATE, BATCH, ADMIN
İletişim Rehberi (Contacts)READ, WRITE, DELETER W DR WR
Şarj İstasyonları (OCPP)READ, WRITE, CONTROL, CONFIGURE, OTA, SECRETSR W Ct Cf Ot Sc
Şarj İst. Modelleri (Charger Models)READ, CREATE, UPDATE, DELETER Cr Up DR
Tenant Ayarları (OCPP profil varsayılanları)READ, UPDATER UpR
OCPP Sürücüleri (Drivers)MANAGEM
OSOS Bağlantıları (DSO)READ, WRITE, DELETE, SYNCR W D SyR SyR
OSOS Toplu YönetimMANAGE (toplu alt bölge/sayaç)M
Mahsuplaşma (Netting)READ, MANAGE, IMPORT (rapor)R M ImR ImR
Denetim (Audit)READR
† Firmware / OTA yönetimi artık yalnız süper yönetici (tenant izinleri inert)

Firmware ve OTA yönetiminin tamamı — firmware sürümü yükleme/yayınlama/kullanımdan kaldırma, tekil ve toplu OTA, rollback, takılan OTA temizliği — yalnızca platform süper yöneticisine açıktır ve Sistem Konsolu → Firmware · OTA (/console/firmware) altında toplanmıştır (bkz. Sistem Konsolu — Firmware · OTA).

Bu nedenle firma (tenant) düzeyi read:firmware / upload:firmware / delete:firmware / read:ota / initiate:ota / batch:ota / admin:ota izinleri hiçbir endpoint tarafından tüketilmiyor (inert) — matriste tüm roller için gösterilir. İzinler enum'da (core/security/permissions.py) ve rol şablonlarında kaldırılmadan durur (fail-closed; ileride yeniden bağlanabilir), ancak bir uca erişim artık sağlamazlar. Bu izinlere sahip ama süper yönetici olmayan bir kullanıcı firmware/OTA uçlarına eriştiğinde 403 SUPERUSER_REQUIRED alır. (Not: cihazın firmware sürümü, cihaz detay ekranlarında salt-okunur görünmeye devam eder — bu bir yönetim işlemi değildir.)

Bazı izinler bekleme (dormant) durumunda olabilir

Enum'daki bazı izinler ileriki fazlar için tanımlıdır ve henüz bir endpoint tarafından tüketilmiyor olabilir (ör. OSOS yönetim izinleri PR-5'e kadar dormant). Bu izinler ROLE_PERMISSIONS şablonlarına eklidir; matris kaynak koddaki güncel tanımı yansıtır.

Bu matris varsayılan 3 rol şablonu içindir

Yukarıdaki dağılım, ROLE_PERMISSIONS içindeki varsayılan Admin / Operator / Viewer şablonlarını yansıtır. ROLE_PERMISSIONS yalnızca ilk kurulum (seed) sırasında okunur; çalışma zamanında izin kontrolü veritabanındaki role_permissions tablosundan yapılır. Bu nedenle bir firmada özel (custom) roller tanımlıysa ya da varsayılan roller sonradan düzenlendiyse, o rollerin izin seti bu matristen sapabilir. Bir rolün kesin/güncel izinlerini görmek için ilgili rolü Ayarlar → Roller ekranından inceleyin.

Kısaltma Açıklamaları

KısaltmaAçıklama
RRead — Okuma / listeleme
WWrite — Yazma / güncelleme
DDelete — Silme
EExport — Dışa aktarma
AAcknowledge — Alarmı onaylama
CClose — Alarmı kapatma
CtControl — Cihaz/inverter/şarj kontrolü (RemoteStart-Stop, Reset vb.)
CfConfigure — Şarj istasyonu yapılandırma (ChangeConfiguration, SetChargingProfile)
OtOTA (şarj) — Şarj istasyonu firmware güncelleme / diagnostik
ScSecrets — Şarj istasyonu parola döndürme + provisioning-kit indirme
SbSubscription — Abonelik yönetimi
UUpload — Firmware yükleme
IInitiate — OTA güncelleme başlatma
BBatch — Toplu OTA
AdAdmin — OTA yönetim (takılı işleri temizleme vb.)
CrCreate — Oluşturma (model kataloğu)
UpUpdate — Güncelleme (model / tenant ayarı)
RqRequest — LOTO talebi oluşturma
AprApprove — LOTO onaylama
ApApply — LOTO uygulama
RlRelease — LOTO serbest bırakma
SySync — OSOS manuel senkron / bağlantı testi (canlı DSO isteği)
MManage — Tam yönetim (sürücü / toplu OSOS / mahsuplaşma yapısal CRUD = manage:netting)
ImImport — Mahsuplaşma / uzlaştırma raporu yükleme (import:settlement_reports — GTŞ/LÜM/PYS)
İzin yok

Frontend (UI) Gating

Yukarıdaki matris backend (sunucu) tarafında zorunlu kılınır: yetkisiz her API isteği 403 Forbidden ile reddedilir. Ancak Zeus 2.0 aynı izinleri arayüzde de uygular — yani izniniz olmayan bir menüyü hiç görmezsiniz, izniniz olmayan bir butonu ekranda bulamazsınız. Amaç, kullanıcıyı erişemeyeceği bir sayfaya tıklatıp 403 hatasıyla karşılaştırmak yerine, en baştan yalnızca yapabileceği işleri göstermektir.

Örnek: Viewer (salt-okuma) rolündeki bir kullanıcı, sol menüde "Ödemeler" ve "Şarj İstasyonları" girişlerini göremez; "Cihazlar" sayfasını açtığında ise "Yeni Cihaz", "Düzenle", "Sil" butonları hiç çizilmez — yalnız listeleme ve detay görüntüleme kalır.

UI gating güvenlik değildir — sadece deneyimdir

Butonun gizli olması işlemi güvenli kılmaz. Gerçek koruma her zaman backend'dedir: bir kullanıcı butonu görmese bile isteği elle (ör. tarayıcı konsolu / API çağrısı) göndermeyi denese, backend izin kontrolü onu 403 ile durdurur. Frontend gating yalnızca kalabalığı azaltır ve deneyimi netleştirir. Bu nedenle hiçbir yetkilendirme kararı yalnız UI'a bırakılmaz.

Nasıl çalışır — izin çözümleme

Kullanıcı giriş yaptığında backend, /api/auth/me yanıtında kullanıcının izin listesini döner. Süper yönetici için bu liste sembolik bir joker (["*"]) içerir. Frontend, bu listeyi tek bir yardımcı (useHasPermission) üzerinden okur ve karar mantığı şudur (frontend/src/hooks/usePermissions.ts):

  1. Kullanıcı henüz yüklenmediyse → izin yok sayılır (öğe gizli kalır, yükleme bitince belirir).
  2. Kullanıcı is_superuser ise → her zaman izinli (tüm menü ve butonlar görünür).
  3. İzin listesi joker (*) içeriyorsa → her zaman izinli.
  4. Aksi halde → izin, listede birebir var mı diye bakılır (ör. write:device).

İzin adları backend'deki Permission enum değerleriyle birebir aynıdır ve eylem:kaynak biçimindedir (ör. read:device, write:alarm, manage:netting, read:report).

1. Sol menü (sidebar) gating

Sol menüdeki her giriş, bir gerekli izne bağlıdır. Kullanıcı o izne sahip değilse menü öğesi listeye hiç eklenmez (gizlenmez — DOM'a bile yazılmaz). Aynı kurallar hem masaüstü menüsünde (hierarchical-sidebar.tsx) hem mobil menüde (mobile-sidebar.tsx) birebir geçerlidir.

Aşağıdaki tablo, hangi iznin hangi menüyü açtığını gösterir (kod: menuConfig). "Viewer görür mü?" sütunu, salt-okuma rolünün o izne sahip olup olmadığını yansıtır.

Menü öğesiGerekli izinViewer görür mü?
Dashboard(koşulsuz — herkes)✅ Evet
Bölgelerread:region✅ Evet
Gateway'lerread:gateway✅ Evet
Cihazlarread:device✅ Evet
Şarj İstasyonlarıread:charger❌ Hayır (viewer'da yok)
OSOS / DSOread:osos_connection✅ Evet
Ölçümlerread:measurement✅ Evet
Alarmlarread:alarm✅ Evet
Raporlarread:report✅ Evet
Ödemelerread:payment❌ Hayır (viewer'da yok)
Mahsuplaşmaread:netting✅ Evet
Piyasa Fiyatlarıread:netting✅ Evet
SLDread:sld✅ Evet
LOTOread:loto✅ Evet
WhatsApp Bridgeyalnız süper yönetici❌ Hayır
Sistem Konsoluyalnız süper yönetici❌ Hayır
Ayarlar(koşulsuz — herkes)✅ Evet*

* Ayarlar menüsü herkese görünür; içerideki her sekme/kart kendi iznini ayrıca kontrol eder (bkz. Ayarlar sekmeleri).

"Firmware" ve "Toplu OTA" artık firma menüsünde değil

Eski Firmware (read:firmware) ve Toplu OTA (batch:ota) sol menü girişleri kaldırıldı; tüm firmware/OTA yönetimi Sistem Konsolu → Firmware · OTA (/console/firmware, yalnız süper yönetici) altında toplandı. /admin/firmware ve /admin/batch-ota yolları /console/firmwaree yönlendirir. Firma kullanıcıları cihazın firmware sürümünü yine cihaz detayında salt-okunur görür, ancak firmware yükleyip OTA başlatamaz.

"Kullanıcılar" artık ayrı menü değil

Eski /users menü girişi kaldırıldı; kullanıcı yönetimi Ayarlar → Kullanıcılar sekmesine taşındı ve read:user iznine bağlıdır. Viewer bu izne sahip olmadığından sekmeyi göremez. (Süper yöneticinin firmalar-arası kullanıcı yönetimi ise Sistem Konsolu altındadır.)

2. Buton / aksiyon gating

Sayfa içindeki her yazma/silme/kontrol butonu, ilgili izne bağlı olarak koşullu çizilir. Sayfayı açan kullanıcının o izni yoksa buton DOM'a hiç eklenmez — yani "pasif/gri buton" değil, hiç yok. Aşağıda kod-doğrulanmış örnekler:

SayfaButon / aksiyonGerekli izinViewer'da durum
Cihazlar (/devices)Cihaz oluştur / düzenlewrite:deviceGizli
CihazlarCihaz sildelete:deviceGizli
CihazlarGateway oluştur / düzenlewrite:gatewayGizli
CihazlarGateway sildelete:gatewayGizli
Alarmlar (/alarms)Alarm kuralı oluştur / düzenle ("Yeni Alarm Kuralı")write:alarmGizli
Mahsuplaşma (/mahsuplasma)"Grup kurulumunu başlat" / sihirbazmanage:nettingGizli

İki katmanlı örnek (Cihazlar): Viewer, sol menüde "Cihazlar" girişini görür (çünkü read:device iznine sahip) ve cihaz listesini/detayını okuyabilir; ancak sayfadaki "Yeni Cihaz", "Düzenle" ve "Sil" butonları çizilmez (bunlar write:device / delete:device ister; aynı sayfadaki gateway butonları da write:gateway / delete:gateway ile korunur). Böylece aynı sayfada okuma serbest, değiştirme kapalı olur.

Firmware / OTA yönetimi tenant yüzeyinden kaldırıldı → süper yönetici konsolu

Eski firma düzeyi firmware yönetim sayfası (/admin/firmware) ve toplu OTA sayfası (/admin/batch-ota) tenant arayüzünden tamamen kaldırıldı; her ikisi de /console/firmwaree yönlendirir. Firmware yükleme / yayınlama / kullanımdan kaldırma ve tekil/toplu OTA, rollback, takılan OTA temizliği artık yalnız süper yönetici tarafından Sistem Konsolu → Firmware · OTA altında yapılır. Bu ekranın koruması buton bazında değil, route seviyesinde süper yönetici kapısıdır: süper yönetici olmayan hiç kimse ne menüyü ne de uçları görür (yetkisiz istek 403 SUPERUSER_REQUIRED alır). Firmware kaldırmak yerine yine "Deprecate" (kullanımdan kaldır) işlemi yapılır. Kullanıcı akışı için Sistem Konsolu — Firmware · OTA.

3. Ayarlar sekme / kart gating

Ayarlar menüsü herkese açıktır, fakat içindeki her sekme ve kart kendi iznini kontrol eder:

  • Kullanıcılar sekmesi — yalnız read:user izni olanlara sekme başlığı olarak görünür. İçeride kullanıcı ekleme write:user, silme delete:user ister. Viewer bu izinlere sahip olmadığından sekmeyi hiç görmez; süper yönetici veya admin görür.
  • Marka / Genel Ayarlar kartı — kart read:tenant_settings ile görünür; "Kaydet" butonu ise update:tenant_settings izni yoksa devre dışı kalır (kart görünür ama değişiklik uygulanamaz).

Bu, "menüyü herkese aç, ayrıntıyı izinle kısıtla" desenidir: kullanıcı Ayarlar'a girer, yalnız yetkili olduğu sekmeleri/kartları görür.

4. Sayfa düzeyi gating (salt-okuma engeli)

Bazı sayfalar, okuma izni bile yoksa boş bir bilgilendirme kartı gösterir ve gereksiz veri isteği (dolayısıyla 403) yapmaz. Örneğin Mahsuplaşma panosu, read:netting izni olmayan kullanıcıya Mahsuplaşma modülü için "read:netting" yetkisi gerekir. Yöneticinizle iletişime geçin. mesajını içeren bir kart (NoReadPermissionCard) gösterir; alttaki veri sorguları yalnızca izin varsa (enabled: canRead) çalışır. Böylece:

  • İzni olan kullanıcı → veriyi görür + yetkisi ölçüsünde aksiyon butonlarını görür.
  • Okuma izni olmayan kullanıcı → boş, açıklayıcı kart görür (ekran çökmez, ham hata görünmez).

Benzer şekilde Kullanıcılar sekmesi, read:user izni yoksa "Bu sayfayı görüntülemek için read:user izniniz olmalı. Yöneticinizden yetki talep edin." mesajını gösterir.

Viewer (salt-okuma) rolü — tam davranış özeti

Viewer rolünün arayüzde ne gördüğünü tek bakışta özetleyelim:

  • Sol menüde görünür: Dashboard, Bölgeler, Gateway'ler, Cihazlar, OSOS/DSO, Ölçümler, Alarmlar, Raporlar, Mahsuplaşma, Piyasa Fiyatları, SLD, LOTO, Ayarlar.
  • Sol menüde GİZLİ: Şarj İstasyonları, Ödemeler, WhatsApp Bridge, Sistem Konsolu. (Firmware ve Toplu OTA menüleri artık hiçbir firma rolünde yoktur — süper yönetici konsoluna taşındı.)
  • Butonlar: Hiçbir "oluştur / düzenle / sil / kontrol / senkron / mahsuplaşma yönet" butonu görünmez. Yalnız listeleme, detay ve (Raporlar'da) dışa aktarma kalır.
  • Ayarlar: Menü açılır ama Kullanıcılar sekmesi görünmez; salt-okuma kartlarında "Kaydet" devre dışıdır.
Bir kullanıcının yetkisini artırmak

Bir kullanıcı bir menüyü/butonu göremiyorsa, çözüm arayüzde değil rol atamasındadır. Rol ataması Ayarlar → Kullanıcılar sekmesinde yapılır (bu sekme read:user, kullanıcı düzenleme write:user izni ister); firmalar-arası (cross-tenant) kullanıcı yönetimi ise süper yönetici için Sistem Konsolu → Kullanıcılar altındadır. Yöneticiniz kullanıcıya daha yetkili bir rol (ör. Viewer → Operator) atadığında, kullanıcı çıkış-giriş yaptıktan (veya oturumu yenilendikten) sonra yeni menü ve butonlar otomatik belirir. Roller ve izinler için bu sayfadaki İzin Matrisi bölümüne bakın.