Identity & Access
Bu sayfa, Cınga backend içinde kullanıcı kimliği, rol modeli, cihaz bazlı authority yapısı ve izin katmanını detaylı biçimde açıklar. Amaç yalnız kullanıcı hesabı tutmak değil; hangi kullanıcının hangi cihaz üzerinde hangi aksiyonları yapabileceğini veri modeli üzerinden açık ve izlenebilir hale getirmektir.
Katmanın Temel Mantığı
Identity & Access modelinde üç ayrı seviye vardır:
- Kullanıcı kimliği
- Genel rol / profil
- Cihaz bazlı otorite ve aksiyon izinleri
Bu üçü aynı şey değildir ve aynı tabloda eritilmez.
1. users
users, sistemdeki gerçek kullanıcı kimliğinin ana tablosudur.
Neden vardır?
- uygulamaya giriş yapan kişi burada tanımlanır
- notlar, inbox, finans ve cihaz yetkileri kullanıcı kimliği etrafında döner
- mobil uygulama oturumları kullanıcıyla ilişkilidir
Kolonlar
| Kolon | Tip | Null | Anlamı |
|---|---|---|---|
id | int | hayır | Kullanıcı anahtarı |
email | varchar(100) | evet | E-posta ile giriş/iletişim |
phone_number | varchar(20) | evet | Telefon numarası |
password_hash | varchar(255) | evet | Parola hash’i |
pin_hash | varchar(255) | evet | PIN hash’i |
first_name | varchar(100) | evet | Ad |
last_name | varchar(100) | evet | Soyad |
role_id | int | evet | Genel rol |
status_id | int | evet | Kullanıcı statüsü |
address_id | int | evet | Adres ilişkisi |
last_login_time | timestamp | evet | Son giriş zamanı |
marketing_consent | boolean | hayır | Pazarlama izni |
create_time | timestamp | hayır | Oluşturma |
update_time | timestamp | hayır | Güncelleme |
Örnek kayıt
{
"id": 1,
"email": "gunce@example.com",
"phone_number": "905321112233",
"first_name": "Mehmet Günce",
"last_name": "Akkoyun",
"role_id": 1,
"status_id": 1,
"address_id": 2,
"last_login_time": "2026-04-03T09:30:00Z",
"marketing_consent": true
}
Ne içermez?
- belirli bir cihaz üzerindeki yetki
- cihaz başlat/durdur gibi aksiyon izinleri
- mobil cihaz tokenları
2. user_roles
Bu tablo sistem içindeki genel rol sözlüğünü taşır.
Neden vardır?
Kullanıcı rolü tekrar eden bir sözlüktür. Rol bilgisini her kullanıcı satırında serbest string olarak taşımak yerine normalize biçimde referans vermek daha doğrudur.
Kolonlar
| Kolon | Tip | Null | Anlamı |
|---|---|---|---|
id | int | hayır | Rol anahtarı |
name | varchar(100) | hayır | Rol kodu/adı |
description | varchar(255) | evet | Açıklama |
Örnek roller
adminsupervisortechniciandealerfarmerfarmer_employee
Tasarım notu
user_roles, kullanıcının sistem içindeki genel profilini tanımlar; cihaz bazlı erişim sınırını tek başına belirlemez.
3. authorities
authorities, bir kullanıcının belirli bir cihaz üzerindeki temel otoritesini temsil eder.
Neden vardır?
Global rol tek başına yeterli değildir. Aynı rolü taşıyan iki kullanıcı farklı cihazlarda farklı erişim seviyesine sahip olabilir. Bu nedenle kullanıcı ile cihaz arasındaki ilişki ayrı bir tabloyla modellenir.
Kolonlar
| Kolon | Tip | Null | Anlamı |
|---|---|---|---|
id | int | hayır | Authority anahtarı |
device_id | varchar(21) | hayır | Yetkinin geçerli olduğu cihaz |
user_id | int | hayır | Yetki sahibi kullanıcı |
owner | boolean | hayır | Cihazın sahibi/ana sorumlusu mu |
is_active | boolean | hayır | Yetki aktif mi |
assigned_by | int | evet | Yetkiyi veren kullanıcı |
updated_by | int | evet | Son düzenleyen |
create_time | timestamp | hayır | Oluşturma |
update_time | timestamp | hayır | Güncelleme |
Örnek kayıt
{
"id": 2,
"device_id": "46000000C47CA670",
"user_id": 2,
"owner": false,
"is_active": true,
"assigned_by": 1,
"updated_by": 1
}
Ne içermez?
- aksiyon bazlı detay izinler
- kullanıcı rolü bilgisi
- cihazın metadata’sı
4. permissions
Bu tablo aksiyon seviyesindeki izin sözlüğünü taşır.
Neden vardır?
Bir authority kaydı yalnız “bu kullanıcı cihazla ilişkili” demekle kalmaz; ayrıca neler yapabileceği de bilinmelidir. İzinlerin kod tabanında dağılmaması için bunlar sözlük olarak tutulur.
Kolonlar
| Kolon | Tip | Null | Anlamı |
|---|---|---|---|
id | int | hayır | İzin anahtarı |
code | varchar(100) | hayır | Teknik izin kodu |
name | varchar(150) | hayır | İnsan okunur ad |
description | varchar(255) | evet | Açıklama |
is_active | boolean | hayır | Aktiflik |
create_time | timestamp | hayır | Oluşturma |
update_time | timestamp | hayır | Güncelleme |
Örnek izinler
pump.startpump.stopnotes.viewnotes.addfinances.viewreports.viewdevice.settings.change
5. authority_permissions
Bu tablo bir authority kaydına hangi izinlerin bağlandığını taşır.
Neden vardır?
Kullanıcının cihaz üzerindeki yetkisi tek tip olmayabilir. Bazı kullanıcı yalnız rapor görüntüler, bazıları not ekler, bazıları pompa başlatır. Bu nedenle authority ile permission arasında ayrı ilişki gerekir.
Kolonlar
| Kolon | Tip | Null | Anlamı |
|---|---|---|---|
id | int | hayır | İlişki anahtarı |
authority_id | int | hayır | Authority kaydı |
permission_id | int | hayır | Verilen izin |
is_active | boolean | hayır | İzin aktif mi |
granted_by | int | evet | İzni veren kullanıcı |
create_time | timestamp | hayır | Oluşturma |
update_time | timestamp | hayır | Güncelleme |
Örnek kayıt
{
"id": 5,
"authority_id": 3,
"permission_id": 1,
"is_active": true,
"granted_by": 1
}
6. mobile_devices
Bu tablo kullanıcıya ait mobil kurulumları ve push token ilişkisini taşır.
Neden vardır?
Bir kullanıcının birden fazla telefonu olabilir. Push token, cihaz platformu ve uygulama sürümü kullanıcı tablosunda tutulursa hem tekrar oluşur hem de çok cihazlı senaryo bozulur.
Kolonlar
| Kolon | Tip | Null | Anlamı |
|---|---|---|---|
id | int | hayır | Mobil cihaz anahtarı |
user_id | int | hayır | Sahibi olan kullanıcı |
device_identifier | varchar(255) | hayır | Uygulama kurulum kimliği |
push_token | varchar(255) | hayır | Push token |
platform | enum | hayır | ios / android |
manufacturer | varchar(50) | evet | Üretici |
model | varchar(50) | evet | Model |
os_version | varchar(50) | evet | OS sürümü |
app_version | varchar(50) | evet | Uygulama sürümü |
is_active | boolean | hayır | Kurulum aktif mi |
last_login_time | timestamp | evet | Son giriş |
last_seen_time | timestamp | evet | Son görülme |
create_time | timestamp | hayır | Oluşturma |
update_time | timestamp | hayır | Güncelleme |
Örnek kayıt
{
"id": 1,
"user_id": 1,
"device_identifier": "ios-installation-001",
"push_token": "expo_token_user1_ios",
"platform": "ios",
"manufacturer": "Apple",
"model": "iPhone 14",
"os_version": "17.4",
"app_version": "1.0.3",
"is_active": true,
"last_seen_time": "2026-04-03T10:30:00Z"
}
Kimlik ve Yetki Katmanının Temel Kararları
Global rol ile cihaz yetkisi farklıdır
users.role_id→ kullanıcının genel sistem profiliauthorities→ kullanıcı ile cihaz arasındaki ilişkiauthority_permissions→ bu ilişki üzerindeki aksiyon sınırı
Kullanıcı ile mobil cihaz farklı şeydir
Push ve mobil oturum takibi kullanıcı tablosuna gömülmez; mobile_devices tablosu ayrı tutulur.
Yetki cihaz bazlıdır
Bu model şu an cihaz merkezli yetki kurgusunu benimser. İleride grup/proje bazlı authorization katmanı eklenebilir; fakat mevcut sözleşmede authority ana ekseni cihazdır.
Sonuç
Identity & Access veri modeli, Cınga backend’te kullanıcıyı yalnız bir hesap kaydı olarak değil; genel rol, cihaz ilişkisi, aksiyon izni ve mobil kurulumları ile birlikte tanımlar. Böylece sistem hem kullanıcıyı tanır hem de aynı kullanıcının farklı cihazlarda farklı yetki seviyeleriyle çalışabilmesini veri modeli üzerinden yönetebilir.