RBAC uygulamada: Uygulamanız için güvenli yetkilendirme nasıl uygulanır
Rol Tabanlı Erişim Kontrolü (RBAC) ile ilgili eksiksiz kılavuz: İzin tasarımında ustalaşın, rol yönetimi ve pratik bir CMS uygulaması ile güvenli yetkilendirme sağlayın.
Uygulamanız için güvenli ve ölçeklenebilir bir yetkilendirme sistemi uygulamakta zorlanıyor musunuz? Rol Tabanlı Erişim Kontrolü (RBAC), kullanıcı izinlerini yönetmek için endüstri standardıdır, ancak bunu doğru bir şekilde uygulamak zor olabilir. Bu eğitim, gerçek bir İçerik Yönetim Sistemi (CMS) örneğini kullanarak sağlam bir RBAC sistemi nasıl oluşturulacağını gösterecektir.
Bu kılavuzu izleyerek, şunları öğreneceksiniz:
- ✨ Size kesin kontrol sağlayan ince taneli izinlerin nasıl tasarlanıp uygulanacağı
- 🔒 İzinleri anlamlı rollere organize etmenin en iyi uygulamaları
- 👤 Kaynak mülkiyetini etkili bir şekilde ele alma teknikleri
- 🚀 Yetkilendirme sisteminizi ölçeklenebilir ve sürdürülebilir hale getirmenin yolları
- 💡 Gerçek dünya CMS örneği ile pratik uygulama
Bu eğitimin tam kaynak kodu GitHub adresinde mevcuttur.
RBAC Temellerini Anlamak
Rol Tabanlı Erişim Kontrolü, kullanıcılara izin atamaktan daha fazlasıdır. Güvenliği sürdürülebilirlikle dengeleyen yapılandırılmış bir yetkilendirme yaklaşımı yaratmaktır.
RBAC Nedir hakkında Auth Wiki'de daha fazla bilgi edinebilirsiniz.
Uygulama sırasında takip edeceğimiz ana ilkeler şunlardır:
İnce Taneli İzin Tasarımı
İnce taneli izinler, sisteminizde kullanıcıların ne yapabileceği üzerinde size kesin kontrol verir. "admin" veya "kullanıcı" gibi geniş erişim düzeyleri yerine, kullanıcıların kaynaklar üzerinde gerçekleştirebileceği belirli eylemleri tanımlarız. Örneğin:
read:articles
- Sistem içerisindeki herhangi bir makaleyi görüntüleyincreate:articles
- Yeni makaleler oluşturunupdate:articles
- Mevcut makaleleri değiştirinpublish:articles
- Makalelerin yayın durumunu değiştirin
Kaynak Mülkiyeti ve Erişim Kontrolü
Kaynak mülkiyeti, CMS'mizin yetkilendirme tasarımındaki temel bir kavramdır. RBAC farklı rollerin gerçekleştirebileceği eylemleri tanımlarken, mülkiyet erişim kontrolüne kişisel bir boyut katar:
- Yazarlar oluşturdukları makalelere otomatik erişime sahiptir
- Bu doğal mülkiyet modeli, yazarların her zaman kendi içeriklerini görüntüleyip düzenleyebilecekleri anlamına gelir
- Sistem, makalelerle ilgili işlemleri ele alırken hem rol izinlerini hem de mülkiyeti kontrol eder
- Örneğin,
update:articles
izni olmadan bile, bir yazar kendi makalelerini düzenlemeye devam edebilir - Bu tasarım, ekstra rol izinlerine ihtiyaç duyulmasını azaltırken güvenliği sürdürür
Bu çift katmanlı yaklaşım (roller + mülkiyet), daha sezgisel ve güvenli bir sistem oluşturur. Yayımlar ve yöneticiler, rol izinleri aracılığıyla tüm içeriği yönetebilirken, yazarlar kendi çalışmaları üzerinde kontrol sahibi olurlar.
Güvenli API'ler Tasarlamak
Öncelikle CMS'mizin çekirdek işlevselliğini API uç noktaları aracılığıyla tasarlamaya başlayalım:
API'niz için Erişim Kontrolünü Uygulamak
Her bir uç nokta için erişim kontrolünün iki yönünü düşünmeliyiz:
- Kaynak mülkiyeti - Kullanıcı bu kaynağın sahibi mi?
- Rol tabanlı izinler - Kullanıcının rolü bu işlemi yapmasına izin veriyor mu?
Her uç nokta için erişimi nasıl ele alacağımız:
Uç Nokta | Erişim kontrol mantığı |
---|---|
GET /api/articles | - list:articles izni olan herkes, veya yazarlar kendi makalelerini görebilir |
GET /api/articles/:id | - read:articles izni olan herkes, veya makalenin yazarı |
POST /api/articles | - create:articles izni olan herkes |
PATCH /api/articles/:id | - update:articles izni olan herkes, veya makalenin yazarı |
DELETE /api/articles/:id | - delete:articles izni olan herkes, veya makalenin yazarı |
PATCH /api/articles/:id/published | - Sadece publish:articles izni olan kullanıcılar |
Ölçeklenebilir Bir İzin Sistemi Oluşturmak
API erişim gereksinimlerimize dayanarak, bu izinleri tanımlayabiliriz:
İzin | Açıklama |
---|---|
list:articles | Sistemdeki tüm makalelerin listesini görüntüleyin |
read:articles | Herhangi bir makalenin tam içeriğini okuyun |
create:articles | Yeni makaleler oluşturun |
update:articles | Herhangi bir makaleyi tadil edin |
delete:articles | Herhangi bir makaleyi silin |
publish:articles | Yayın durumunu değiştirin |
Unutmayın, bu izinler yalnızca sizin sahip olmadığınız kaynaklara erişirken gereklidir. Makale sahipleri otomatik olarak:
- Kendi makalelerini görüntüleyebilir (
read:articles
gerekmez) - Kendi makalelerini düzenleyebilir (
update:articles
gerekmez) - Kendi makalelerini silebilir (
delete:articles
gerekmez)
Etkili Rolleri Oluşturmak
API ve izinlerimizi tanımladığımıza göre, bu izinleri mantıksal olarak gruplandıran roller oluşturabiliriz:
İzin/Rol | 👑 Admin | 📝 Editör | ✍️ Yazar |
---|---|---|---|
Açıklama | Tüm içerik yönetimi için tam sistem erişimi | Tüm makaleleri görüntüleyebilir ve yayın durumunu kontrol edebilir | Sistemde yeni makaleler oluşturabilir |
list:articles | ✅ | ✅ | ❌ |
read:articles | ✅ | ✅ | ❌ |
create:articles | ✅ | ❌ | ✅ |
update:articles | ✅ | ❌ | ❌ |
delete:articles | ✅ | ❌ | ❌ |
publish:articles | ✅ | ✅ | ❌ |
Not: Yazarlar, rol izinlerinden bağımsız olarak kendi makaleleri için okuma/güncelleme/silme izinlerine sahiptir.
Her rol belirli sorumluluklarla tasarlanmıştır:
- Admin: CMS üzerinde tam kontrol sahibi, tüm makale işlemlerini içerir
- Editör: İçerik inceleme ve yayın yönetimi odaklıdır
- Yazar: İçerik oluşturma konusunda uzmanlaşmıştır
Bu rol yapısı açık bir iş dağılımı yaratır:
- Yazarlar içerik oluşturmaya odaklanır
- Editörler içerik kalitesini ve görünürlüğünü yönetir
- Adminler genel sistem kontrolünü sağlar
Logto'da RBAC Yapılandırması
Öncelikle, Logto Cloud üzerinde bir hesap oluşturmanız veya Logto OSS sürümünü kullanarak bir kendi barındırılan Logto instance'ı kullanmanız gerekmektedir.
Ancak bu eğitim için basitlik adına Logto Cloud'u kullanacağız.
Uygulamanızı Ayarlamak
- Logto Konsolunda "Uygulamalar" sekmesine giderek yeni bir React uygulaması oluşturun
- Uygulama adı: İçerik Yönetim Sistemi
- Uygulama türü: Geleneksel Web Uygulaması
- Yönlendirme URI'leri: http://localhost:5173/callback
API Kaynaklarını ve İzinlerini Yapılandırma
- Logto Konsolunda "API Kaynakları" sekmesine giderek yeni bir API kaynağı oluşturun
- API adı: CMS API
- API tanımlayıcısı: https://api.cms.com
- API kaynağına izinler ekleyin
list:articles
read:articles
create:articles
update:articles
publish:articles
delete:articles
Roller Oluşturma
CMS için Logto Konsolunda Rollere giderek aşağıdaki rolleri oluşturun
- Admin
- tüm izinlerle
- Editör
read:articles
,list:articles
,publish:articles
ile
- Yazar
create:articles
ile
Kullanıcılara Roller Atama
Logto Konsolunda "Kullanıcı yönetimi" bölümüne giderek kullanıcılar oluşturun.
Kullanıcı detaylarının "Roller" sekmesinde, kullanıcıya roller atayabilirsiniz.
Örneğimizde, şu rollerle 3 kullanıcı oluşturuyoruz:
- Alex: Admin
- Bob: Editör
- Charlie: Yazar
Logto RBAC ile Frontend'inizi Entegre Edin
Artık Logto'da RBAC yapılandırdık, bunu frontend'imize entegre etmeye başlayabiliriz.
Öncelikle, uygulamanıza Logto entegrasyonu için Logto Hızlı Başlangıçlarını izleyin.
Örneğimizde, gösterim için React kullanıyoruz.
Uygulamanızdan Logto'yu yapılandırdıktan sonra, Logto'nun çalışması için RBAC yapılandırmalarını eklememiz gerekiyor.
Zaten oturum açtıysanız, bu değişikliğin etkili olması için oturumu kapatıp tekrar oturum açmayı unutmayın.
Kullanıcı, yukarıda belirtilen API kaynaklarına erişim jetonu talep ederek Logto ile giriş yaptığında, Logto, kullanıcının rolüyle ilgili kapsamları (izinleri) erişim jetonuna ekleyecektir.
Erişim jetonundan kapsamları almak için useLogto
hookundan getAccessTokenClaims
'i kullanabilirsiniz.
Ve userScopes
'u kullanarak kullanıcının kaynağa erişim iznine sahip olup olmadığını kontrol edebilirsiniz.
Logto RBAC ile Backend'inizi Entegre Edin
Şimdi, Logto RBAC'i backend'inize entegre etme zamanı.
Backend Yetkilendirme Ortası
İlk olarak, kullanıcı izinlerini kontrol etmek, kullanıcının oturum açıp açmadığını doğrulamak ve belirli API'lere erişmek için gerekli izinlere sahip olup olmadığını belirlemek için bir middleware eklememiz gerekiyor.
Gördüğünüz gibi, bu arabirimde, frontend isteğinin geçerli bir erişim belirteci içerip içermediğini doğruluyoruz ve erişim jetonunun hedef kitlesinin Logto Konsolunda oluşturduğumuz API kaynağıyla eşleşip eşleşmediğini kontrol ediyoruz.
API kaynağını doğrulamanın nedeni, API kaynağımız aslında CMS backend'imizin kaynaklarını temsil eder ve tüm CMS izinlerimiz bu API kaynağı ile ilişkilendirilmiştir.
Bu API kaynağı Logto'da CMS kaynaklarını temsil ettiğinden, frontend kodumuzda API isteklerini backend'e yaparken ilgili Erişim jetonunu ekleriz:
Artık requireAuth
middleware'ini API uç noktalarımızı korumak için kullanabiliriz.
API Uç Noktalarını Korumak
Belirli izinlere sahip kullanıcılar için yalnızca erişilebilir olması gereken API'lar için, kısıtlamaları doğrudan arabirimde ekleyebiliriz. Örneğin, makale oluşturma API'si yalnızca create:articles
iznine sahip kullanıcılar için erişilebilir olmalıdır:
Hem izinleri hem de kaynak mülkiyetini kontrol etmesi gereken API'ler için hasScopes
işlevini kullanabilirsiniz. Örneğin, makale listeleme API'sinde, list:articles
iznine sahip kullanıcılar tüm makalelere erişebilirken, yazarlar sadece kendi oluşturdukları makalelere erişebilir:
Bu noktada, RBAC uygulamasını tamamladık. Tam uygulamayı görmek için tam kaynak kodunu inceleyebilirsiniz.
CMS RBAC Uygulamasını Test Etmek
Şimdi, oluşturduğumuz üç kullanıcıyı kullanarak CMS RBAC uygulamamızı test edelim.
Önce, Alex ve Charles olarak oturum açalım ve bazı makaleler oluşturalım.
Alex, Admin rolüne sahip olduğundan, tüm makaleleri oluşturabilir, silebilir, güncelleyebilir, yayınlayabilir ve görüntüleyebilir.
Charles, Yazar rolüne sahip olduğundan, yalnızca kendi makalelerini oluşturabilir ve yalnızca sahip olduğu makaleleri görüntüleyebilir, güncelleyebilir ve silebilir.
Bob, Editör rolüne sahip olup tüm makaleleri görüntüleyip yayımlayabilir ama oluşturan, güncelleyip silme yeteneğine sahip değildir.
Sonuç
Tebrikler! Uygulamanızda sağlam bir RBAC sistemi nasıl uygulanacağını öğrendiniz.
Daha karmaşık senaryolar için, örneğin çok kiracılı uygulamalar oluşturmak gibi, Logto kapsamlı organizasyon desteği sağlamaktadır. Organizasyon çapında erişim kontrolü uygulamak hakkında daha fazla bilgi edinmek için Çok Kiracılı SaaS uygulaması kurma: Tasarımdan uygulamaya eksiksiz bir kılavuz rehberimizi inceleyin.
Kodlamalarınızda başarılar! 🚀