AIFA AKADEMI · Kurumsal Wiki
4.310 makale
Ana sayfa Kurumsal Wiki › Kod mimarisi › Security › SEC-AUTHZ

Yetkilendirme

SECURITYERPGOLD_COREACTIVEHIGHSOURCE_IMPLEMENTED
Kanonik kaynak: markdown · bu sayfa üretilmiş görünümdür

Kaynak: docs/knowledge-base/security/authorization.md — KB-docs. Parola/hash algoritma ayrıntıları burada özetlenir; değer taşınmaz.

Yetkilendirme (Authorization) — ERPPRO / ERPGOLD V2

Kapsam: Kullanıcı grubu bayrakları (Sistem.UserGroup.Permission), menü (Ribbon) izinleri, işlem ekranı (iScreen) buton görünürlükleri, şube/kasa/şirket kapsamı ve özel durumlar (GroupId=1, UserId=1, IsResmi, Provizyon, PIN gereken işlemler). Gerçeklik türü: AS-IMPLEMENTED. Etiketler: VERIFIED / INFERRED / UNKNOWN. Kimlik doğrulama → security/authentication.md; ayar enum'ları → architecture/configuration.md.


1. Yetki modeli özeti — VERIFIED

Sistem.Users ──< Sistem.UserDetails (UserId, SubeId, KasaId, GroupId, IsLocked) >── Sistem.UserGroup (Permission)
                                   │
                        Sistem.GetUsers(@SirketId)  (TVF)  →  AIO.Sistem.LoginUser
                                                                  └─ .Group = New AIO.Sistem.Usergroup(GroupId)
                                                                          └─ LoadPermission(Permission) → 23 Boolean + MenuPermisson listesi
  • Yetki şube bazlıdır: aynı kullanıcı farklı şubelerde farklı gruba/kasaya bağlanabilir (UserDetails satırı başına). Kaynak: kb_src/db/columns.json (Sistem.UserDetails), Class/Ext/Sistem.LoginUser.vb:22-37.
  • Grup nesnesi girişte bir kez yüklenir ve LoginInformation.User.Group üzerinden süreç boyunca kullanılır; grup izinleri değişince kullanıcı yeniden giriş yapmalıdır (INFERRED: yeniden yükleme çağrısı yok; yalnız şube değişiminde Login tekrar çalışır → FrmMainForm.vb:41).
  • Denetim istemci tarafındadır: bayraklar buton görünürlüğü/enabled ve mesaj kutuları ile uygulanır; DB tarafında (tetikleyici/proc) kullanıcı grubu kontrolü yoktur — VERIFIED: kb_src/db/modules_all.json içinde 12 tetikleyiciden hiçbiri UserGroup/Permission okumaz; yalnız Cari.HesapUpdate "Yetkiniz yoktur!" RAISERROR'u vardır (koşulu UNKNOWN, bu dokümanda incelenmedi).

2. Permission alanı: kodlama ve çözme — VERIFIED

2.1 Yazma (FrmAddUserGroup.GetToCode, Form/Users/FrmAddUserGroup.vb:78-121)

  1. 23 onay kutusu True/False metinleri ; ile birleştirilir, sonuna | eklenir (:80-103). Sıra: Takoz; Maden; Hurda; Nakit; Cevir; Vadeli; Hizmet; Tas; Pirlanta; Model; Genel; IslemDuzelt; IslemIptal; Kod; Borc; Virman; Fatura; Emtia; SeriIslem(PesinKontrol); Cesni; Parite; TicketStatus; Bakiye(ShowBalance).
  2. Griddeki her görünür işaretli menü öğesi için Ceng(Page;Group;Item)| eklenir (:104-111). Ceng Türkçe karakterleri ASCII'ye çevirir (ığüşöçĞÜŞİÖÇ → igusocGUSIOC, Class/Module/Extention.vb:237-244).
  3. Sonuç dizenin her karakteri Asc(c).ToString("000") ile 3 haneli ASCII koda çevrilir (:117-120). Örnek: "True;"084114117101059. Bu bir kodlamadır, şifreleme değildir (INFERRED: tersine çevrilebilir, gizlilik sağlamaz).
  4. Usergroup.Permission = GetToCode(); Save() (:143-154) → Sistem.UserGroup INSERT/UPDATE parametreli (Sistem.Usergroup.vb:273, 307).

2.2 Okuma (Usergroup.LoadPermission, Class/Dao/Sistem.Usergroup.vb:54-113)

  • 3'er karakter → Chr(Val(…)) ile geri çevrilir (:61-68), | ile bölünür (:69).
  • İlk parça ; ile bölünüp Per1.Length >= n kontrolleriyle 23 bayrağa atanır (:71-96) — eski (daha kısa) kayıtlarla geriye uyumlu: eksik bayraklar False kalır.
  • Sonraki parçalar Page;Group;Item üçlüsü olarak MenuPermisson listesine eklenir (:97-104).
  • Tüm blok Try/Catch içinde, catch boş (:108-110) → bozuk kayıt sessizce "yetkisiz" sonucu verir (INFERRED).
  • Permission boşsa ("") hiçbir bayrak yüklenmez (:55) — ancak NULL ise Me.Permission atanmaz ve LoadPermission(Nothing) çağrısı AscData = "" karşılaştırmasında True döner (VB'de Nothing = "" True) → aynı sonuç.

2.3 Tablo — 23 bayrak

İndeks Bayrak (Usergroup özelliği) Ekran kutusu (FrmAddUserGroup) Ne açar Kaynak (uygulama noktası)
0 Takoz ChkTakoz iScreen: BtnTakozGiris (Provizyon değilse), BtnTakozCikis; kayıt çift tık ile TAKOZ giriş/çıkış ve ÇEŞNİ işlem açma iScreen.vb:47-48, 652-654, 705 (Cesni yerine Takoz bayrağı kontrol ediliyor — VERIFIED tutarsızlık)
1 Maden ChkMaden BtnMaden, BtnTeslimat; MADEN işlem açma; ParakendeSatis'te CmbIslem.Items(1) iScreen.vb:50, 56, 657; ParakendeSatis.vb:58
2 Hurda ChkHurda BtnHurda; HURDA açma iScreen.vb:51, 663
3 Nakit ChkNakit BtnNakit; NAKIT açma iScreen.vb:52, 669
4 Cevir ChkCevir BtnCevir; CEVIR açma iScreen.vb:53, 675
5 Vadeli ChkVadeli BtnVadeli; VADELI açma iScreen.vb:54, 687
6 Hizmet ChkHizmet BtnHizmet; HIZMET açma iScreen.vb:55, 681
7 Tas ChkTas BtnTas (Provizyon değilse); TAS açma iScreen.vb:57, 693
8 Pirlanta ChkPirlanta BtnPirlanta (Provizyon değilse); PIRLANTA açma iScreen.vb:58, 695
9 Model ChkModel BtnModel (Provizyon değilse); MODEL açma iScreen.vb:59, 697
10 Genel ChkGenel BtnGenel (Provizyon değilse); GENEL açma iScreen.vb:60, 699
11 IslemDuzelt ChkIslemDuzelt BtnDuzelt görünürlüğü; düzeltmede "İşlem Düzeltme Yetkiniz Yok."; DynamicList BtnKayıtDuzelt iScreen.vb:67, 279, 594-597, 1196; DynamicList.vb:63
12 IslemIptal ChkIslemIptal BtnIptal, BtnIptalFisNo görünürlüğü; iptalde "İşlem İptal Etme Yetkiniz Yok."; FrmTransfer BtnIptal; GiseEkrani iptal; DynamicList BtnKayitSil iScreen.vb:68, 280, 730-733, 1197-1198; FrmTransfer.vb:48; GiseEkrani.vb:600; DynamicList.vb:62
13 KodTanimlama ChkKod DbCombo içinde Insert tuşu ile yeni kod (DbCombo öğesi) ekleme Controls/Editor/DbCombo.vb:184
14 BorcIslemleri ChkBorc BtnBorcIslem (Provizyon değilse); BORC açma; FrmPozisyonDurum "KZ" kolonu iScreen.vb:66, 701; FrmPozisyonDurum.vb:22
15 VirmanIslemleri ChkVirman BtnVirman, BtnVirman1 (Provizyon değilse) iScreen.vb:62-63
16 FaturaIslemleri ChkFatura BtnFatura (Provizyon değilse) iScreen.vb:61
17 EmtiaIslemleri ChkEmtia BtnEmtia (Provizyon değilse); EMTIA açma iScreen.vb:65, 703
18 PesinKontrol ChkSeriIslem "Peşin işlem kontrolü": fiş yazdırmadan önce Cari.Islem.GetFisTutar(UserId, FisNo) <> 0 ise "İşlemin Karşılığı Bulunamadı…" ve yazdırma iptal; ilgili işlem bayrağı yoksa kayıt çift tıkta SERIISLEM ekranı açılır iScreen.vb:98-104, 659-689; FrmSeriIslem.vb:227-232
19 Cesni ChkCesni BtnCesni görünürlüğü iScreen.vb:49 (açma tarafında kullanılmıyor, bkz. indeks 0)
20 Parite ChkParite BtnParite iScreen.vb:64
21 TicketStatus ChkTicketStatus Takvim görevlerinde başkasının görevini düzenleme / ChkAktif (aktif-pasif) değiştirme Controls/Takvim/Class/ShowTicket.vb:46-48
22 ShowBalance ChkBakiye iScreen bakiye gridi (GrdBakiye); sipariş ekranlarında Fiyat/Tutar/Birim kolonları iScreen.vb:10; FrmSiparisGirisi.vb:59-63; FrmSipModelEkle.vb:250

Bulgular (VERIFIED): - FrmAddUserGroup.FormDataBind (:9-48) mevcut grubu yüklerken ChkTicketStatus atanmaz (grep: yalnız :102'de yazılır). INFERRED: grup her düzenlenip kaydedildiğinde TicketStatus kutunun varsayılan (işaretsiz) değerine döner. - iScreen.vb:705: tIslemKodu.CESNI için Group.Takoz kontrol edilir, Group.Cesni değil. - iScreen.vb:1196-1198 (VwIslem.RowCountChanged): BtnIptalFisNo görünürlüğü IslemIptal'e göre yeniden atanır; InitPermission (:46) ise Program.IsResmi'ye göre atar → satır sayısı değişince IsResmi koşulu ezilir (INFERRED çelişki).


3. Menü (Ribbon) izinleri — VERIFIED

Kaynak: Class/Dao/Sistem.Usergroup.vb:125-162 (CreateMenu), :115-124 (FindByMenuName), :163-192 (MenuPermission); çağrı: Program.InitLoginInformation.User.Group.CreateMenu() (Program.vb:229).

  • Her RibbonPage → RibbonPageGroup → BarButtonItemLink için anahtar Ceng(Sayfa) ; Ceng(Grup) ; Ceng(Başlık) üretilir (:129).
  • Öğe görünür olur eğer: anahtar MenuPermisson listesinde varsa veya grup adı "GrpInfo" ise veya Program.UserId = 1 ise (:130-134). Aksi halde itm.Visible = False.
  • Boş kalan gruplar ve sayfalar gizlenir (:139-156).
  • Hata olursa "Kullanıcı Grup Yetkileri Alınamadı… Lütfen Tekrar Giriş Yapmayı Deneyiniz." + End (:157-160).
  • FrmMainForm.MenuClick yalnız Links(0).Visible = True olan öğelerde ItemClick yükseltir (FrmMainForm.vb:53-56) → gizli öğe kısayolla da çalışmaz (INFERRED).
  • Eşleşme ekran metnine (sayfa/grup/başlık) dayanır: bir menü başlığı değişirse tüm gruplarda o izin kaybolur (INFERRED risk). İzin listesi FrmAddUserGroup.GetItems (:50-70) tarafından GrpInfo hariç canlı Ribbon'dan üretilir.
  • Dinamik (AifaDeveloper/UiDesigner.PopulatePage) ribbon öğeleri CreateMenu'den önce eklendiğinden (Program.vb:213 → :229) aynı görünürlük kuralına tabidir (INFERRED).
  • Program.UserId <> 1 istisnası: Sistem.Users.Id = 1 olan kullanıcı tüm menüleri görür (Usergroup.vb:131). FrmMainForm.vb:706: User.Id = 1 + Shift+D ile BtnDevir görünür.

4. Kapsam: şirket / şube / kasa — VERIFIED

Kapsam Nasıl belirlenir Kaynak
Şirket Giriş ekranında CmbSirket (Sistem.Sirketler); Program.SirketId = LoginInformation.Sirket.Id FrmLoginForm.vb:50-55; Program.vb:121-129
Şube Sistem.GetUsers(SirketId) Where UserId → kullanıcının UserDetails satırları; giriş sonrası FrmMainForm.CmbSube (CmbActiveSube repository, Sistem.getusers(SirketId) Where UserId) ile geçiş; geçişte LoginInformation.Login(YeniSube, …) ve Program.Init() yeniden çalışır FrmLoginForm.vb:97; Program.vb:234-238; FrmMainForm.vb:35-52
Kasa UserDetails.KasaIdLoginInformation.Kasa; Program.KasaId; IsLocked=True ise işlem ekranlarında kasa/şube seçim kutusu kilitli (kullanıcı yalnız kendi kasasında işlem yapar) Login.vb:25; Program.vb:139-147; iHesapControl.vb:71, FrmOdemeGirisi.vb:6, FrmTransferEkle.vb:7, Mutabakat.vb:6, MutabakatOnay.vb:16, HizliSatisEkrani.vb:23, ParakendeSatis.vb:70, DataStokList.vb:171, FrmOdemeListesi.vb:8
Veri filtreleme Sorgular Program.SubeId/KasaId/SirketId ile string birleştirilerek filtrelenir (ör. FrmMainForm "CESNISTOKLARI", "IZINLISTESI") FrmMainForm.vb:204-207 vb.

Not (VERIFIED): LoginUser.New Sistem.GetUsers(0) kullanır — SirketId filtresi yoktur; UserId + SubeId çifti belirleyicidir.


5. Özel durumlar

5.1 GroupId = 1 — VERIFIED

  • iScreen.Init: BtnIslemAktar.Visible = (LoginInformation.User.GroupId = 1) (iScreen.vb:35); tıklamada tekrar kontrol edilip FrmHesapTemizle(HesapId) açılır (:1179-1187). INFERRED: GroupId=1 "yönetici grubu" varsayımıdır; Sistem.SirketOlustur yeni şirkette Id=1 grubunu ve Id=1 kullanıcısını oluşturur (modules_all.json, satır 34-35).
  • Başka GroupId = 1 kontrolü yok (grep).

5.2 Program.IsResmi (Sube.IsResmi) — VERIFIED

  • iScreen.InitPermission: BtnIptalFisNo yalnız resmi şubede görünür (:46); tıklamada sabit yönetici parolası istenir ve Cari.Islemler IsDeleted='True' yapılır (:720-727; parola → authentication.md §6).
  • FrmMainForm.FormInit: RbSeriIslem.Visible = Sube.IsResmi (Seri işlem ribbon sayfası) (:11).
  • Program.IsResmi yorumu: "Doviz programı olarak çalışıyorsa Maden Satış işleminde İşçilik hanesinin gelmesini sağlar" (Program.vb:56-61). ResmiIslemLimitiTL (Program.vb:62-66) — kullanım yeri bu dokümanda incelenmedi (UNKNOWN).
  • ShadowMode (Sube.SubeTipi="DOVIZ") kullanıcının kendi parolasıyla açılır/kapanır ve DB'ye yazılır (Program.vb:31-55) → application-flow.md §2.9.

5.3 Provizyon modu (GlobalSettings.Provizyon = True ve karşı hesap tanımlı) — VERIFIED

iScreen.IsProvizyon = (GlobalSettings.Provizyon And CmbHesap.KarsiHesapId <> 0) (iScreen.vb:37-41). Bu durumda gizlenen butonlar (bayrak True olsa bile): BtnTakozGiris, BtnTas, BtnPirlanta, BtnModel, BtnGenel, BtnFatura, BtnVirman, BtnVirman1, BtnEmtia, BtnBorcIslem (:47, 57-63, 65-66). Görünür kalanlar: TakozCikis, Cesni, Maden, Hurda, Nakit, Cevir, Vadeli, Hizmet, Teslimat, Parite, Duzelt, Iptal. İptalde ayrıca AIO.Cari.Provizyon.IsAllow(Id) kontrolü: "Önce Gönderen Şube İptal Etmelidir." (:736-739). iFormBase.IsProvizyon aynı kural (iFormBase.vb:55).

5.4 Düzeltme / iptal / mutabakat kilitleri (GlobalSettings) — VERIFIED

Kaynak: iScreen.vb:622-645 (düzelt), :745-765 (iptal); enum'lar Form/Settings/Settings.vb:65-90. | Ayar | Enum | Davranış | |---|---|---| | DuzeltmeOnayiModifyPermission | tPermission: SilmeYapilir=0, EskiTariheYapilamaz=1, PinGerekli=2 | PinGerekli ve işlem DuzeltmeGun günden eskiyse PinShowDialog; EskiTariheYapilamaz ve eskiyse "İşlemi Düzeltmezsiniz." | | SilmeOnayiDeletePermission | tPermission | PinGerekli ise her iptalde PIN; EskiTariheYapilamaz ve SilGun'den eskiyse "Yöneticiniz İptal Edebilir." | | MutabakatLockMutabakatPermission | tPermissionV1: IslemYapilir=0, PinGerekli=1, IslemYapilamaz=2 | Hesabın LastMutabikId >= Id ise: IslemYapilamaz → engel; PinGerekli → PIN (sonraki PIN atlanır, SkipPin) | Not: iScreen.vb:641'deki koşul ModifyPermission = tPermission.EskiTariheYapilamaz = tPermission.EskiTariheYapilamaz biçiminde yazılmıştır (çift eşitlik) — VB'de (a = b) = b olarak değerlendirilir; INFERRED: EskiTariheYapilamaz(=1) için True = 1 karşılaştırması True döner, SilmeYapilir(=0) için False = 1… davranışı belirsiz; UNKNOWN (test edilmedi).

5.5 PesinKontrol (ChkSeriIslem) — VERIFIED

Bayrak açık olan gruplarda, fiş basılmadan önce AIO.Cari.Islem.GetFisTutar(Program.UserId, FisNo) sıfırdan farklıysa ("işlemin karşılığı girilmemiş") yazdırma engellenir (iScreen.vb:98-104, FrmSeriIslem.vb:227-232). Ayrıca kullanıcının ilgili işlem türü bayrağı yoksa kayıt çift tıkta SERIISLEM ekranı açılır (iScreen.vb:659-689). INFERRED: "peşin/seri işlem" operatörleri için kısıtlı bir çalışma modu.

5.6 ShowBalance ve TicketStatus — VERIFIED

  • ShowBalance=False: işlem ekranında bakiye gridi gizli (iScreen.vb:10); sipariş ekranlarında Fiyat/Tutar/Birim kolonları kaldırılır (FrmSiparisGirisi.vb:59-63; FrmSipModelEkle.vb:250).
  • TicketStatus=True: başka kullanıcının takvim görevini düzenleyebilir ve ChkAktif alanını değiştirebilir (ShowTicket.vb:46-48).

5.7 Yetki ekranı (Form/Users/FrmAddUserGroup.vb) — VERIFIED

  • "KULLANICIGRUPLARI" menüsü → DataGridList.Show(Of AIO.Sistem.Usergroup) (FrmMainForm.vb:283-284); düzenleme formu FrmAddUserGroup.
  • FormInitGetItems() canlı Ribbon'dan menü listesi (Page/Group/Item/Visible) üretir (:50-70); BtnTumunuSec tüm menüleri işaretler (:156-160); FormSaveGetToCode() + Usergroup.Save() (:143-154). SirketId = Program.SirketId olarak yazılır (:147).
  • Grup düzenleme yetkisi: menü görünürlüğüne bağlı (ayrı bir bayrak yok) — INFERRED.

6. Kanıt listesi

  • ERPPRO/Class/Dao/Sistem.Usergroup.vb:29-50 (New), 54-113 (LoadPermission), 115-124 (FindByMenuName), 125-162 (CreateMenu), 163-192 (MenuPermission), 228-253 (özellikler), 271-337 (Insert/Update)
  • ERPPRO/Form/Users/FrmAddUserGroup.vb:4-48, 50-70, 78-121, 123-141, 143-160
  • ERPPRO/Class/Module/Extention.vb:237-244 (Ceng)
  • ERPPRO/Controls/Islem Ekranı/Base Control/iScreen.vb:4-17, 24-41, 43-89, 96-104, 279-280, 594-645, 650-706, 720-765, 1179-1187, 1194-1198
  • ERPPRO/Controls/Islem Ekranı/Ekran/iFormBase.vb:55; …/Ekran/FrmTransfer.vb:48; …/Ekran/ParakendeSatis.vb:58, 70, 469-476; …/Ekran/SeriIslemEkrani/FrmSeriIslem.vb:227-232; …/Parakende/GiseEkrani.vb:600-604; …/Parakende/HizliSatisEkrani.vb:23; …/Base Control/iHesapControl.vb:71
  • ERPPRO/Controls/Editor/DbCombo.vb:184; ERPPRO/Class/Dao/Dynamic/Controls/DynamicList.vb:62-63; ERPPRO/Controls/Takvim/Class/ShowTicket.vb:46-48; ERPPRO/Controls/Grid/DataStokList.vb:171
  • ERPPRO/Form/Siparis/FrmSiparisGirisi.vb:59-63; ERPPRO/Form/Siparis/FrmSipModelEkle.vb:250; ERPPRO/Form/RefreshGrid/FrmPozisyonDurum.vb:22; ERPPRO/Form/Tanımlamalar/Stok/Mutabakat.vb:6, MutabakatOnay.vb:16
  • ERPPRO/Form/Genel/FrmMainForm.vb:8-29, 35-56, 283-284, 705-717
  • ERPPRO/Class/Module/Program.vb:31-66, 121-165, 213, 229, 234-238
  • ERPPRO/Class/Module/Login.vb:19-44; ERPPRO/Class/Ext/Sistem.LoginUser.vb:22-37
  • ERPPRO/Form/Settings/Settings.vb:65-90
  • ERPPRO/Class/Ext/Cari.Provizyon.vb:323-327
  • DB: Sistem.GetUsers (IF), Sistem.SirketOlustur (P, satır 34-35), tetikleyici listesi — kb_src/db/modules_all.json; Sistem.UserGroup/UserDetails kolonları — kb_src/db/columns.json

7. Bilinmeyenler (UNKNOWN)

  • Cari.HesapUpdate tetikleyicisindeki "Yetkiniz yoktur!" RAISERROR koşulu (hangi alan/kullanıcı) — incelenmedi.
  • AIO.Cari.Provizyon.IsAllow(Id) kuralının tam içeriği.
  • Program.ResmiIslemLimitiTL ve Sube.IsLimitControl alanlarının hangi ekranlarda uygulandığı.
  • FrmHesapTemizle (BtnIslemAktar) işleminin veri etkisi.
  • iScreen.vb:641 çift eşitlik koşulunun çalışma zamanı davranışı.
  • Rapor/tasarımcı ekranlarında (ReportManager, DashBoardDesigner, RibbonDesigner, SQLEDITOR) menü görünürlüğü dışında ek bir yetki kontrolü olup olmadığı — grep'te Group. kullanımı görülmedi (INFERRED: yok), tek tek doğrulanmadı.
  • AifaDev.Forms dinamik formlarındaki yetki modeli (CodeDesigner projesi) — incelenmedi.