Yenilikçi bir yaklaşım olarak v4.0.0-beta.1 sürümünü yayımladım ve burada, bu sürümde yer alan yeniliklerin yanı sıra, çözmeyi amaçladığı spesifik problemi paylaşmak istiyorum.
Problem
Problem
Spatie’nin laravel-permission paketi, Laravel ekosisteminde standart bir izin yönetim paketi olarak tanınıyor. Ancak, bu paket genellikle kullanıcıların rolleri ve bu rollerin izinleri olduğu basit bir model için tasarlanmıştır. Bu modelde, her istek başına birkaç kez kontrol yapılır, veritabanına ulaşılır, herkes memnun kalır.
Bu modeli ölçeklendirdiğinizde ne olur?
- 200+ ACL-korunan widget’ı render eden bir yönetim paneli
- 30 mikroservisi yöneten bir API gateway’i, her bir kontrol için yetkilendirme bağlamı gerektirir
- Kullanıcı filtreli verileri raporlayan bir gösterge paneli, her alanda izin kontrolleri yapar
Bu noktada, her izin kontrolü için bir veritabanı erişimi gerekebilir ve p99 gecikmesi, yetkilendirme tarafından belirlenmiş olur.
Bu paket ne yapar?
Bu paket ne yapar?
Tüm okuma yolunu Redis’e taşır.
- Roller ve izinler Redis SET’leri içinde denormalize edilir:
user:{id}:permissions,user:{id}:roles - İzin kontrolleri artık
SISMEMBERile yapılır — ~0.1ms, veritabanı gidiş dönüşü 5-20ms karşısında - Yazmalar (atanma/kaldırma) veritabanını günceller, olayları tetikler ve Redis önbelleğini yeniden ısıtır
- Önbellek geçersiz kılma, olay odaklı ve otomatikdir
Trade-off: Redis bağımlılığı, kullanıcı girişi sırasında önbelleği ısıtma yükü, biraz daha karmaşık yazma yolu.
v4.0.0-beta.1’de neler yeni?
v4.0.0-beta.1’de neler yeni?
İzin grubu meta verisi
İzin grubu meta verisi
Daha önce PermissionDTO::group her zaman null olarak kalmıştı, çünkü Redis grup verisi depolamıyordu. Artık bir Redis hash’i (permission_groups) mevcut ve {guard}|{name} → group haritalaması yapıyor. getAllPermissions() düzgün bir şekilde zenginleştirilmiş DTO’lar döndürüyor.
Rol seviyesinde izin kontrolleri
Rol seviyesinde izin kontrolleri
Role::hasPermission('posts.create') — rolün izin seti üzerinde doğrudan SISMEMBER. Kullanıcı yüklemeden “admin rolü X’e sahip mi?” sorusunu cevaplamak için yararlıdır.
Kuyruk destekli önbellek ısıtma
Kuyruk destekli önbellek ısıtma
Isıtma komutları artık --queue:
php artisan permissions-redis:warm --queue=default
php artisan permissions-redis:warm-user 42 --queue=default
Senkron çalıştırmak yerine WarmAllCacheJob / WarmUserCacheJob tetikler. Milyonlarca kullanıcıyı ısıtmak için kullanışlıdır.
Çoklu kullanıcı modelleri
Çoklu kullanıcı modelleri
Konfigürasyonda user_model‘i bir dizi olarak ayarlayın:
'user_model' => [App\Models\User::class, App\Models\Admin::class],
Her iki model de ısıtılır ve her ikisi de Gate::before süper yöneticisi ile korunur.
Blade direktifi koruma geçersiz kılma
Blade direktifi koruma geçersiz kılma
@role('admin', 'api')
...
@endrole
İkinci argüman, koruma adı. Altı direktif (@role, @hasanyrole, @hasallroles, @permission, @hasanypermission, @hasallpermissions) bunu kabul eder.
UUID/ULID rol kimlikleri
UUID/ULID rol kimlikleri
Eğer Rol modeliniz tarihsel olmayan birincil anahtarlar kullanıyorsa, v4 bunu ele alır. PermissionRepositoryInterface artık rol kimliklerini int|string olarak türler.
Savunmacı eklemeler
Savunmacı eklemeler
- Hafıza içinde çözücü önbelleğinde LRU (Least Recently Used) temizliği — uzun süreli işlemler (kuyruk işçileri, Octane) için bellek büyümesini engeller. Varsayılan limit: 1000 kullanıcı.
- Isıtma bekleme süresi — Eğer Redis önbellek oluşturma sürekli olarak başarısız olursa, çözücü veritabanına ısıtma girişimleri yapmayı durdurur (varsayılan: 1 saniye cooldown her kullanıcı için).
-
TransactionFailedException— RedisEXECnull/false döndüğünde, gözlemlenebilir hatalar fırlatır, yazmalar sessizce kaybolmaz.
Önemli değişiklik
Önemli değişiklik
PermissionRepositoryInterface, izin grubu meta verisi için üç yeni yöntem ekledi:
public function setPermissionGroups(array $groups): void;
public function getPermissionGroups(array $encodedNames): array;
public function deletePermissionGroup(string $encodedName): void;
Arayüzün özel bir uygulamasını (tenant-aware veya başka) kullanıyorsanız, bunları uygulamak zorundasınız. Eğer yalnızca yerleşik RedisPermissionRepository‘yi kullanıyorsanız, kod değişikliği yok — yeni hash’i doldurmak için yükseltme sonrası php artisan permissions-redis:warm --fresh komutunu çalıştırmanız yeterlidir.
Betayı kur
Betayı kur
composer require scabarcas/laravel-permissions-redis:^4.0@beta
php artisan vendor:publish --tag=permissions-redis-migrations
php artisan migrate
php artisan permissions-redis:warm --fresh
Beklentilerim
Beklentilerim
1-2 hafta boyunca beta süreci sonrasında rc.1 olarak kesmeyi planlıyorum. Aşağıdaki konularda geri bildirim bekliyorum:
- Yeni yöntemlerin API ergonomisi
- Yükseltme kılavuzunun netliği
- Özel yapınızda (tenancy, özel korumalar, UUID kullanıcılar) herhangi bir şeyin bozulup bozulmadığı
Sürüm notları · GitHub · Packagist
Denediğinizde bana nasıl gittiğini bildiriniz.
Kaynak: Orijinal Makale


