Yetkilendirme
RBAC ve UBAC yetki modeli.
Çağıranın kimliği doğrulandıktan sonra ErtisAuth isteği yapıp yapamayacağına karar verir. Karar iki modeli birleştirir:
- RBAC (rol tabanlı erişim kontrolü): çağıranın rolünün yetkileri.
- UBAC (kullanıcı tabanlı erişim kontrolü): kullanıcı ya da uygulama üzerinde saklanan, çağıranın kendine ait yetkileri.
Aynı model hem ErtisAuth'un kendi API'sini hem de SDK aracılığıyla sizin API'lerinizi korur.
Yetki ifadeleri#
Bir yetki, noktalarla ayrılmış en fazla dört bölümden oluşan bir ifadedir:
subject.resource.action.object| Bölüm | Anlamı | Örnekler |
|---|---|---|
subject | İşlemi yapan: bir kullanıcı ya da uygulama id'si | *, 66f1c0d2a4b5c6d7e8f90124 |
resource | Ne tür bir şey | users, roles, orders |
action | Ne yapılıyor | create, read, update, delete ya da approve gibi herhangi bir özel işlem |
object | Tek bir şey: bir kaynak id'si | *, 66f1c0d2a4b5c6d7e8f90127 |
*, bulunduğu bölümün her değeriyle eşleşir. Kısa yazımlarda eksik bölümler * sayılır:
| Yazılan | Anlamı | İzin verdiği |
|---|---|---|
users | *.users.*.* | kullanıcılar üzerinde her şey |
users.read | *.users.read.* | herhangi bir kullanıcıyı okuma |
users.update.66f1…27 | *.users.update.66f1…27 | o tek kullanıcıyı güncelleme |
66f1…24.orders.approve.* | (yazıldığı gibi) | o subject'in herhangi bir siparişi onaylaması |
Bölümlerin kuralları:
resourceveactionaddır ve büyük/küçük harf ayrımı yapılmadan karşılaştırılır (Users.Read,users.readile aynıdır).subjectveobjectid'dir ve birebir karşılaştırılır.- Bir bölüm boş olamaz,
.ya da*ile başlayıp bitemez ve*bir değerin parçası olarak kullanılamaz (user*geçersizdir). Geçersiz ifadeler400 InvalidRbacile reddedilir.
UBAC ifadeleri#
Bir kullanıcının ya da uygulamanın permissions ve forbidden listeleri aynı biçimi subject olmadan kullanır (subject, kullanıcının ya da uygulamanın kendisidir): resource.action.object; kısa yazımlar da aynıdır (users, users.read).
Bir istek nasıl kontrol edilir#
ErtisAuth, korunan bir endpoint'e gelen her istek için endpoint'ten ve çağırandan isteğin ifadesini oluşturur:
subject: çağıranın id'si,resourceveaction: endpoint'in tanımladığı değerler (örneğinusersveread),object: tek kaynak endpoint'lerinde route'taki id (GET /users/{id}), diğerlerinde*.
Örneğin 66f1…24 kullanıcısının yaptığı GET /memberships/{m}/users/66f1…27 isteği 66f1…24.users.read.66f1…27 olarak kontrol edilir.
Ardından karar bu sırayla verilir:
- Önce UBAC. Çağıranın kendi
permissionsya daforbiddenlistesindeki bir girdi eşleşirse kararı yalnızca çağıranın kendi girdileri verir: bir yetki eşleşir ve hiçbir yasak eşleşmezse izin verilir, aksi halde reddedilir. - Sonra rol. Aksi halde rol karar verir:
permissionsgirdilerinden biri eşleşir veforbiddengirdilerinden hiçbiri eşleşmezse izin verilir. Bir yasak girdisi, aynı rolün yetkisine karşı her zaman kazanır. - Sonra kendi kaydı kuralları. İkisi de izin vermezse, rol işlemi açıkça yasaklamadıkça iki istisna yine de geçerlidir:
- bir kullanıcı kendi kullanıcı kaydını, bir uygulama da kendi uygulama kaydını güncelleyebilir;
- bir uygulama kendi uygulama kaydını okuyabilir.
- En son scope'lar. Token bir scoped token ise, yukarıda izni hangisi vermiş olursa olsun, scope'larının da isteği kapsaması gerekir.
Reddedilen bir istek 403 AccessDenied döner.
Her kullanıcının ve uygulamanın bir rolü olmalıdır. Rolü boş olan ya da rolü artık mevcut olmayan biri, kendi yetkileri ne olursa olsun korunan her endpoint'te reddedilir (403 AccessDenied, "The user has no role" ya da "The user role is not found by the given slug"). API her zaman bir rol istediği için bu yalnızca veri API dışında değiştirildiğinde ya da hâlâ kullanımda olan bir rol silindiğinde olur.
Örnekler#
Bir rol:
{
"name": "Support Agent",
"slug": "support",
"permissions": [ "users.read", "users.update", "roles.read" ],
"forbidden": [ "users.update.66f1c0d2a4b5c6d7e8f90124" ]
}| İstek | Sonuç | Neden |
|---|---|---|
| Herhangi bir kullanıcıyı okuma | izin verilir | users.read |
…27 kullanıcısını güncelleme | izin verilir | users.update |
…24 kullanıcısını güncelleme | reddedilir | rol bunu yasaklıyor |
| Herhangi bir kullanıcıyı silme | reddedilir | eşleşen yetki yok |
| Rolleri okuma | izin verilir | roles.read |
Bu role ve kendi girdilerine sahip bir kullanıcı:
{
"username": "agent-007",
"role": "support",
"permissions": [ "users.delete" ],
"forbidden": [ "roles.read" ]
}| İstek | Sonuç | Neden |
|---|---|---|
| Herhangi bir kullanıcıyı silme | izin verilir | kullanıcının kendi yetkisi karar verir (önce UBAC) |
| Rolleri okuma | reddedilir | kullanıcının kendi yasak girdisi karar verir |
| Herhangi bir kullanıcıyı okuma | izin verilir | hiçbir UBAC girdisi eşleşmiyor, rol izin veriyor |
Aynı ifade hem permissions hem de forbidden listesinde bulunamaz: böyle bir rol ya da uygulama 400 ModelValidationError, böyle bir kullanıcı 409 UbacsConflicted ile reddedilir.
Ayrıcalıklı alanları değiştirme#
Kendi kaydı kuralı kullanıcıların kendi profillerini düzenlemesine izin verir, ama bazı alanlar güç verir. Bir kullanıcıda bunlardan herhangi birini değiştirmek, rolden ya da UBAC'tan gelen, o kullanıcı üzerinde gerçek bir users.update yetkisi gerektirir; kendi kaydı kuralı bunları kapsamaz:
rolepermissionsforbiddenis_activeuser_type
Aksi halde güncelleme, alanların listesiyle birlikte 403 AccessDenied ile reddedilir.
source_provider ve connected_accounts alanlarını ErtisAuth kendisi yönetir: istemcilerin gönderdiği değerler yok sayılır.
ErtisAuth API'sinin kaynakları#
| Kaynak | Endpoint'ler | İşlemler |
|---|---|---|
memberships | /memberships | create, read, update, delete |
users | /memberships/{m}/users | create, read, update, delete |
otp | /memberships/{m}/users/{id}/generate-otp | create |
user-types | /memberships/{m}/user-types | create, read, update, delete |
roles | /memberships/{m}/roles | create, read, update, delete |
applications | /memberships/{m}/applications | create, read, update, delete |
providers | /memberships/{m}/providers | create, read, update, delete |
tokens | /memberships/{m}/active-tokens, /revoked-tokens, /codes | read, create |
events | /memberships/{m}/events | read |
webhooks | /memberships/{m}/webhooks | create, read, update, delete |
mailhooks | /memberships/{m}/mailhooks | create, read, update, delete |
code-policies | /memberships/{m}/code-policies | create, read, update, delete |
Her referans sayfası, her endpoint'in istediği yetkiyi listeler. Birkaç endpoint, beklemeyebileceğiniz bir yetki ister:
| Endpoint | Yetki |
|---|---|
GET /users/activation, POST /users/reset-password, POST /users/set-password | users.update |
POST /users/resend-activation-mail | users.create |
GET /users/verify-reset-token, GET /users/check-password | users.read |
GET /users/{id}/generate-otp | otp.create |
POST /codes, GET /codes/{user_code}, POST /codes/{user_code}/approve, POST /codes/{user_code}/deny | tokens.create |
Şifre sıfırlama sayfası gibi herkese açık sayfalar bu endpoint'leri genellikle bir uygulamanın Basic token'ıyla, backend'inizden çağırır.
memberships kaynağı kurulum genelidir. Okuma yetkisi membership'lerin gizli anahtarlarını açığa çıkardığı için bu yetkiyi yalnızca kurulumun operatörlerine verin.admin rolü#
Setup, yukarıdaki her kaynak üzerinde create, read, update ve delete yetkisine sahip ayrılmış admin rolünü oluşturur (örneğin *.users.read.*). admin slug'ına sahip başka bir rol oluşturulamaz (409 ReservedRole) ve admin rolü silinemez (409 SystemRolesCannotBeDeleted).
Yetki kontrolü#
Çağıran için#
Çağıranın token'ının, rolü, UBAC girdileri ve scope'larıyla birlikte bir şeyi yapıp yapamayacağını sorun:
GET /memberships/{membershipId}/roles/check-permission?permission=orders.approve
Authorization: Bearer <access_token>Membership'in geçerli her token'ı bu endpoint'i çağırabilir. İzin varsa 200 OK, yoksa 401 döner.
SDK'nın, API'lerinize gelen her istekte çağırdığı endpoint budur.
Bir rol için#
GET /memberships/{membershipId}/roles/{roleId}/check-permission?permission=users.delete
Authorization: Bearer <access_token>roles.read yetkisi gerektirir. Rolün yetkisi varsa 200 OK, yoksa 401 döner.
403 ile değil, 401 ile yanıtlar.| Hata | Ne zaman |
|---|---|
400 PermissionParameterRequired | permission eksik |
400 InvalidRbac | permission geçerli bir ifade değil |
404 RoleNotFound | Rol yok |
Kendi API'leriniz için yetki tasarlama#
Kaynaklar ve işlemler serbest adlardır; böylece kendi alanınızı modelleyebilirsiniz:
{
"name": "Warehouse Manager",
"slug": "warehouse-manager",
"permissions": [
"orders.read",
"orders.update",
"orders.ship",
"products"
],
"forbidden": [ "products.delete" ]
}Ardından endpoint'lerinizi aynı adlarla koruyun; bkz. .NET SDK.
Dokümantasyonda bir hata mı buldunuz? Issue açın