Cluster ERP istekleri rol tabanlı erişim denetimiyle yetkilendirir: kullanıcı rollere sahiptir, rol izin kodlarına sahiptir ve bir uç bir veya daha çok kod ister. Bu sayfa modules/auth/permissions içindeki izin kataloğunu, modules/auth/roles içindeki rolleri, modules/auth/users içindeki kullanıcı rol atamasını, modules/auth/guards.py içindeki bekçiyi, server/permission_families.py içindeki aile ayrımlarını ve EventBus sözleşmelerindeki REQUIRED_PERMISSION desenini açıklar. Bir izni daraltan öznitelik politikaları ABAC politikaları sayfasında, alan ve satır sınırları alan ve satır erişimi sayfasındadır.
Kısaca¶
- Bir izin kodu
<resource>.<action>biçimindedir. Her açılışta modül metadata'sındaki her varlık ve ayar sekmesi içincreate,read,updatevedeletekodları ile sabit bir ek kod listesi tohumlanır (src/cluster_erp/modules/auth/permissions/services.py:44-136,src/cluster_erp/server/app.py:634-858). - Kodu
adminolan tek bir sistem rolü her açılışta güvenceye alınır ve her canlı izin ona yeniden verilir (src/cluster_erp/modules/auth/roles/services.py:213-276). - Bir uç isteğini
require_permission("<code>")ile bildirir; bekçi çağıranı doğrular, her kodun çağıranda olduğunu denetler, sonra öznitelik politikalarını değerlendirir (src/cluster_erp/modules/auth/guards.py:205-240). - Verme işlemi tavanlıdır: çağıran, sistem yöneticisi rolünde değilse, yalnızca kodlarını zaten taşıdığı bir rolü veya izni ekleyebilir (
src/cluster_erp/modules/auth/users/services.py:169-221,src/cluster_erp/modules/auth/roles/services.py:122-163). - Bir kullanıcının izin kümesi, canlı kullanıcı rol bağları ve canlı izin atamaları üzerinden canlı izinlerin birleşimidir (
src/cluster_erp/modules/auth/users/services.py:310-332).
Nasıl çalışır¶
Veri modeli¶
| Varlık | Tablo | Anahtar alanlar | Kaynak |
|---|---|---|---|
AuthPermission |
auth_permissions |
code (canlı satırlar arasında benzersiz), resource, action, module, translations |
src/cluster_erp/modules/auth/permissions/models.py:15-55 |
AuthRole |
auth_roles |
code (canlı satırlar arasında benzersiz), name, translations, is_system, is_active |
src/cluster_erp/modules/auth/roles/models.py:17-65 |
AuthRolePermission |
auth_role_permissions |
role_id, permission_id (canlı satırlar arasında benzersiz çift) |
src/cluster_erp/modules/auth/roles/models.py:68-97 |
AuthUser |
auth_users |
username, email (her biri canlı satırlar arasında benzersiz), password_hash, is_active, employee_id |
src/cluster_erp/modules/auth/users/models.py:17-91 |
AuthUserRole |
auth_user_roles |
user_id, role_id (canlı satırlar arasında benzersiz çift) |
src/cluster_erp/modules/auth/users/models.py:94-123 |
Atamalar asla silinmez. Bir kullanıcıdan rol veya bir rolden izin kaldırmak deleted_at basar; yeniden eklemek aynı satırı canlandırır (src/cluster_erp/modules/auth/users/services.py:161-181, src/cluster_erp/modules/auth/roles/services.py:115-134).
Kataloğun tohumlanması¶
_seed_permissions_from_metadata her yüklü modül için metadata'daki varlık anahtarlarını ve ayar bölümlerindeki sekme anahtarlarını toplar (src/cluster_erp/server/app.py:639-652). approve, install veya read_all gibi yaşam döngüsü eylemleri için bir ek kod listesi ekler (src/cluster_erp/server/app.py:654-848). seed_from_metadata eksik her kodu yaratır ve var olan bir kodu bugün varlığını bildiren modülün altına yeniden dosyalar (src/cluster_erp/modules/auth/permissions/services.py:44-136). Ardından ensure_system_admin her canlı izni admin rolüne verir, iptal edilmiş atamaları canlandırır ve eski bir system_admin rolünü onunla birleştirir (src/cluster_erp/modules/auth/roles/services.py:174-276). Sonra copy_family_grants çalışır (bkz. Aile ayrımları bölümü).
Bu commit'teki sayılar, kod okunarak yapılmıştır:
| Olgu | Değer | Nasıl sayıldı |
|---|---|---|
| Varlık veya sekme başına tohumlanan CRUD eylemi | 4 | src/cluster_erp/modules/auth/permissions/services.py:54 içindeki actions demeti |
| Tohum listesindeki ek kodlar | 153 | extra_codes içindeki demetler, src/cluster_erp/server/app.py:654-848 |
| Kodla yaratılan roller | 1 (admin, is_system=True) |
src/cluster_erp/modules/auth/roles/services.py:226-236 |
| Verme tavanlarını ve onay adımı rollerini aşan rol kodları | 2 (admin, system_admin) |
SUPERADMIN_ROLE_CODES, src/cluster_erp/modules/auth/users/services.py:32 |
Sabit kodlu require_permission çağrıları |
126 dosyada 1.295 çağrı, 608 ayrı kod | src/cluster_erp üzerinde require_permission(" için grep |
Bir veritabanındaki toplam kod sayısı yüklü modüllere ve metadata'larına bağlıdır; kodda sabit değildir.
İzin denetimi¶
Akış şeması require_permission bekçisinin bir istek için yaptığını gösterir.
flowchart TD
req["korunan istek"] --> user["get_current_user"]
user --> codes["auth_cache.permission_codes"]
codes --> loop{"istenen her kod için"}
loop --> held{"kod var mı?"}
held -->|hayır| deny["permission_denied 403"]
held -->|evet| abac["resource None ile check_abac"]
abac -->|false| deny
abac -->|true| loop
loop -->|hepsi geçti| route["uç işleyicisi"]
route --> post["yüklemeden sonra enforce_abac, yalnız bağlı kodlar"]Düz anlatımla:
get_current_userçağıranı doğrular (src/cluster_erp/modules/auth/guards.py:212). Bkz. kimlik doğrulama ve oturumlar.- Çağıranın kodları kısa ömürlü bellekten gelir (
src/cluster_erp/modules/auth/guards.py:213). - İstenen her kod için eksik bir kod
permission_deniedfırlatır:AUTH_PERMISSION_DENIEDkoduyla HTTP 403 (src/cluster_erp/modules/auth/guards.py:222-224,src/cluster_erp/core/errors.py:388-394). check_abackodun öznitelik politikalarını varlık olmadan değerlendirir;abac_strict_permission_codesiçindeki kodlar politikası yoksa reddedilir (src/cluster_erp/modules/auth/guards.py:215-236).- Bazı servisler varlığı yükledikten sonra
enforce_abacçağırır (src/cluster_erp/modules/auth/guards.py:284-303). Bkz. ABAC politikaları.
Uygulama hakkı iş modüllerinde ayrı bir yönlendirici bağımlılığıdır: require_app. Bkz. uygulama mağazası lisansları ve hakları.
Rol ve izin atama¶
| Uç | İzin | Etki | Kaynak |
|---|---|---|---|
GET /api/v1/auth/permissions/ |
permission.read |
Kataloğu modüle veya kaynağa göre süzerek listeler | src/cluster_erp/modules/auth/permissions/routes.py:14-23 |
PUT /api/v1/auth/roles/{role_id}/permissions |
permission.assign |
Bir rolün izinlerini tavana bağlı olarak değiştirir | src/cluster_erp/modules/auth/roles/routes.py:135-150 |
PUT /api/v1/auth/users/{user_id} |
user.update |
Bir kullanıcıyı role_ids dahil tavana bağlı olarak günceller |
src/cluster_erp/modules/auth/users/routes.py:124-137 |
POST /api/v1/auth/users/{user_id}/reset-password |
user.reset_password |
Başka bir kullanıcının parolasını sıfırlar; işlemi yapan hedefin her koduna sahip olmalıdır | src/cluster_erp/modules/auth/users/routes.py:177-194, src/cluster_erp/modules/auth/users/services.py:234-253 |
DELETE /api/v1/auth/roles/{role_id} |
role.delete |
Bir rolü kullanımdan kaldırır; sistem rolleri reddedilir | src/cluster_erp/modules/auth/roles/routes.py:95-108 |
Tavan AUTH_PRIVILEGE_ESCALATION koduyla privilege_escalation fırlatır ve eksik kodları listeler (src/cluster_erp/core/errors.py:397-405).
Aile ayrımları¶
Bir uç grubu ortak bir kod ailesinden kendi ailesine taşındığında FAMILY_SPLITS ana aileyi ve yeni aileleri adlandırır: 8 alt aileli sales_order ve 23 alt aileli fleet_asset (src/cluster_erp/server/permission_families.py:25-64). Açılışta copy_family_grants, ana kodu taşıyan her role eşleşen alt kodları bir kez verir; ACTION_GRANTS aynısını shipment.dispatch gibi yaşam döngüsü kodları için yapar (src/cluster_erp/server/permission_families.py:67-118).
Sözleşmelerdeki izin sözlüğü¶
EventBus üzerinden başka bir modülde iş başlatan bir uç, gereken kodu başka bir modülün kodunu yazmak yerine sözleşme sınıfından okur. CreateBomForProduct.REQUIRED_PERMISSION ve CreateProductionOrderForProject.REQUIRED_PERMISSION bu özniteliği taşıyan iki sözleşmedir (src/cluster_erp/core/contracts.py:1341-1346, src/cluster_erp/core/contracts.py:1361-1365). Çağıranları src/cluster_erp/modules/sales_orders/order_lines/routes.py:114 ve src/cluster_erp/modules/projects/items/routes.py:94-98 dosyalarıdır.
Neden böyle kurulmuştur¶
- Projenin yazılı mühendislik kuralları modüller arası doğrudan çağrıyı yasaklar;
REQUIRED_PERMISSIONbaşka bir modülün izin dizgisini çağırandan uzak tutar (src/cluster_erp/core/contracts.py:1341-1344). - Kodun modül sahibi tohumlamada yeniden dosyalanır, çünkü eski bir sahip altında dosyalanmış kod rol kuran yöneticiye yanlış modülü gösteriyordu (
src/cluster_erp/modules/auth/permissions/services.py:125-133). - Verme tavanı,
permission.assignveyauser.updatesahibinin kendi veya başka bir kullanıcının yetkisini yükseltememesi için vardır (src/cluster_erp/modules/auth/roles/services.py:122-125,src/cluster_erp/modules/auth/users/services.py:169-172). adminrolüne açılışta tüm kodlar yeniden verilir, çünkü açılıştan sonra her etkin izni taşıması gerekir (src/cluster_erp/modules/auth/roles/services.py:251-256).
Kurallar ve sınırlar¶
- Diğer modüller auth'tan yalnızca
modules/auth/guards.pydosyasını içe aktarır:require_permission,get_current_user,permission_codes_for,actor_allowedverole_ids_for(src/cluster_erp/modules/auth/guards.py:22-27,src/cluster_erp/modules/auth/guards.py:170-202). - Bir kod geneldir. Bekçi kodu denetler, modülü asla denetlemez (
src/cluster_erp/modules/auth/permissions/services.py:126). - Kimlik doğrulayan ama kod istemeyen bir uç doğrudan
get_current_userçağırır; örneğin onay gelen kutusu ve kullanıcının kendi arayüz durumu (src/cluster_erp/modules/auth/approvals/routes.py:35-53,src/cluster_erp/modules/auth/ui_state/routes.py:15-39).
Diğer parçalarla etkileşim¶
authmodülü diğer modüller içinGetUserPermissionssorgusunu yanıtlar (src/cluster_erp/modules/auth/module.py:82,src/cluster_erp/modules/auth/module.py:130-144).- Metadata alanları ve aksiyonları bir izin kodu adlandırabilir; bkz. metadata modeli.
- Uygulama düzeyindeki rol atamaları (hangi rol hangi uygulamayı kullanabilir) ayrı bir katmandır; bkz. uygulama mağazası lisansları ve hakları.
Sınırlar ve açık noktalar¶
- Çalışan bir veritabanındaki izin kodu sayısı koddan belirlenemedi; yüklü modüllere bağlıdır (
src/cluster_erp/server/app.py:642-652). - Web uygulamasının genel rol formunun ötesinde bir izin düzenleyici sunup sunmadığı auth modülü metadata'sından belirlenemedi; orada bildirilen tek rol ekranı
ROLE_METAolur (src/cluster_erp/modules/auth/module.py:281-283).
Tanıtılan terimler¶
| Terim | Kod tanımlayıcısı | Tanım | Türkçe terim | Kaynak |
|---|---|---|---|---|
| permission code | AuthPermission.code |
Bir ucun istediği resource.action biçimindeki dizge. | izin kodu | src/cluster_erp/modules/auth/permissions/models.py:27 |
| role | AuthRole |
Kullanıcılara atanan adlandırılmış izin kodu kümesi. | Rol (webapp/i18n/tr.json anahtarı resource.role) |
src/cluster_erp/modules/auth/roles/models.py:17 |
| system role | AuthRole.is_system |
Silinemeyen rol; kodla yaratılan tek rol admin olur. |
sistem rolü | src/cluster_erp/modules/auth/roles/models.py:46 |
| privilege ceiling | privilege_escalation |
Çağıranın yalnızca zaten taşıdığı kodları verebilmesi kuralı. | yetki tavanı | src/cluster_erp/core/errors.py:397 |
| permission family split | FAMILY_SPLITS |
Uçları kendi alt ailelerine taşınmış bir ana kod ailesi. | izin ailesi ayrımı | src/cluster_erp/server/permission_families.py:25 |
İlgili sayfalar¶
- Kimlik, erişim, kiracılık, gizlilik ve lisans
- ABAC politikaları
- Alan ve satır erişimi
- Auth modülü
- Sözleşmeler başvurusu
92f8051 numaralı commit ile 2026-11-13 tarihinde doğrulandı.