# API Yetki Kontrolu Teknik Belgesi
**1. Özet**
Bu belge, Apisix plugininden gelen kaynakların yetkilendirme ve erişim kontrolü için kullanılan kuralları ve yapılandırmalarını tanımlar.
**2. Temel Kavramlar**
Bu bölümde, API yönetim platformunda kullanılan temel kavramlar ve tanımlar açıklanmaktadır.
- **Kaynak (Resource):** API tarafından sunulan hizmet veya veri.
Yetkilendirme (Authorization): Kullanıcıların veya uygulamaların belirli kaynaklara erişim izni.
- **Kural (Rule):** Erişim kontrolü için kullanılan koşullar ve ifadeler.
- **Privilege:** Belirli bir kaynağa veya hizmete erişim izni.
- **Metot (Method):** HTTP protokolünde kullanılan işlem türleri (GET, POST, PUT, DELETE, vb.).
**3. Kaynak Yönetimi**
Bu bölümde, API yönetim platformunda kaynakların nasıl tanımlandığı ve yönetildiği açıklanmaktadır.
**3.1 Kaynak Tanımı**
Kaynaklar, belirli bir URL deseni ve HTTP metodu ile tanımlanır. Örnek URL deseni ve HTTP metotları aşağıda verilmiştir.
**Örnek:**
**URL Deseni:** /fora/DigitalServices/AccountService.svc/hesaplar/([^/]+)/islemler?hesapIslemBslTrh=([^/]+)&hesapIslemBtsTrh=([^/]+)
**3. Yetkilendirme ve Yetki Yönetimi**
Kaynaklara erişim kontrolü, yetkilendirme ve yetki yönetimi aracılığıyla gerçekleştirilir. Privilege ve Rule kavramları kullanılarak erişim kontrolleri sağlanır.
Query stringden gelen checkAuthMethod alanının değerine ("Privilege" veya "Rule") göre bu 2 yöntemden biri kullanılır. Boş gelirse "Privilege" yöntemi kullanılır.
**3.1 Privilege Yöntemi**
Bu yöntemde, check işlemini yapacak servisin URL'i kullanılır.
URL, header ve query string gibi değişkenler içerebilir.
**Örnek**
http://localhost:3000/fora/DigitalServices/AccountService.svc/accounts/match/{header.customerId}/{header.ibanNumber}.
- Başlık değişkenleri "header." ile başlar. Örneğin: header.customerId.
- Query stringler "query." ile başlar. Örneğin: query.hesapIslemBslTrh.
- Kaynaktaki regex URL'leri sıra numarasıyla 1'den başlayarak path.var1 şeklinde belirtilir. Örneğin: path.var1 == "hesap1".
**3.2 Rule Yöntemi**
Bu yöntemde, Microsoft Rule Engine kütüphanesi kullanılır. (https://github.com/microsoft/RulesEngine)
- Rule, "header", "path", "body" gibi veri kaynaklarına ve mantıksal işlemlere dayanan ifadeler içerir.
**Örnek Kullanımlar:**
- Utils.CallApiPost(\"https://dummyjson.com/products/1)\", body). IsSuccessStatusCode == true
- Utils.CallApiGet("https://dummyjson.com/products/1").Data.price.ToInt() > 500
- Utils.CallApiGet("https://dummyjson.com/products/1").Data.brand.ToString() == "Apple"
Data alanı dynamic olduğu için, bu alan aşağıdaki Extension Methodlar kullanılarak istenilen tipe dönüştürülmelidir:
- ToString()
- ToInt() (Başarısız bir dönüştürmede 0 olarak döner)
- ToDouble() (Başarısız bir dönüştürmede 0 olarak döner)
- ToFloat() (Başarısız bir dönüştürmede 0 olarak döner)
- ToBool() (Başarısız bir dönüştürmede false olarak döner)
- ToDateTime() (Başarısız bir dönüştürmede DateTime.Min() olarak döner)
- ToArray() (Başarısız bir dönüştürmede null olarak döner)
**Kurallarda Kullanılabilecek Veri Kaynakları:**
- **Header:** Apisix tarafından ele alınan HTTP isteği başlıkları. Örnek: header.authorization.
- **Path:** Regex ile tanımlanmış URL yolu parçaları. Örnek: path.var2 == "musteri".
- **Body:** İstek gövdesi içindeki JSON verileri. Örnek: body.adSoyad == "Ahmet Yılmaz".
- **Query:** URL içindeki sorgu parametreleri. Örnek: query.islemTuru == "Havale".
**Kurallarda Kullanılabilecek Mantıksal İşlemler:**
- == (Eşittir)
- != (Eşit değildir)
- <,>, >=, <= (Karşılaştırma)
- && (Ve)
- || (Veya)
- ! (Değil)
**Kurallarda Kullanılabilecek Fonksiyonlar:**
- Utils.CheckContains(string value, string searchValue): value içinde searchValue değerinin olup olmadığını kontrol eder.
**Önemli Notlar:**
- Utils.CallApiGet ve Utils.CallApiPost fonksiyonları ile harici API çağrıları yapılabilmektedir.
- Dönen verinin başarı durum (IsSuccessStatusCode) ve içeriği (Data) kontrole dahil edilebilir.
- Kuralların önceliği konfigürasyonda belirlenir.
- Birden fazla kural varsa, öncelik sırasına göre değerlendirilir.
**Sonuç**
Bu belge, Apisix plugininde kaynak yetkilendirme ve erişim kontrolü için kullanılan yapılandırma seçeneklerini ve kuralların nasıl yazılacağını açıklamıştır. Yetkilendirme işlemi, Privilege veya Rule yöntemlerinden biri kullanılarak gerçekleştirilir. Kaynaklar, yetkiler, kaynak yetkileri ve kurallar birbirleriyle ilişkili yapılandırılır ve erişim kontrol kararları bu kurallara göre verilir.