Permission Kılavuzu
Permission sisteminin kullanımı ve best practice'ler.
Genel Bakış
Permission sistemi, kullanıcıların belirli işlemleri gerçekleştirme yetkisini kontrol eder. Permission'lar rollere atanır ve kullanıcılar rolleri üzerinden permission'lara erişir.
Permission Kontrolü
Controller'da Permission Kontrolü
Controller metodlarında permission kontrolü yapılır:
public function index(Request $request)
{
$user = $request->user();
// Genel permission kontrolü
if (! $user->hasPermission('users.view')) {
return response()->json(['message' => 'Forbidden'], 403);
}
// ...
}
.own Permission Kontrolü
Kullanıcının sadece kendi kaynaklarını yönetmesi için:
public function show(Request $request, User $user)
{
$currentUser = $request->user();
// Genel permission veya .own permission kontrolü
if (! $currentUser->hasPermissionOrOwn('users.view', $user)) {
return response()->json(['message' => 'Forbidden'], 403);
}
// ...
}
Kaynak Sahibi Kontrolü
Kaynak sahibi kontrolü ile permission kontrolü:
public function update(Request $request, User $user)
{
$currentUser = $request->user();
// Kaynak sahibi kontrolü ile permission kontrolü
if (! $currentUser->canManageResource('users.update', $user)) {
return response()->json(['message' => 'Forbidden'], 403);
}
// ...
}
Permission Metodları
hasPermission(string $permissionSlug): bool
Kullanıcının belirli bir permission'a sahip olup olmadığını kontrol eder:
if ($user->hasPermission('users.manage')) {
// Kullanıcı users.manage permission'ına sahip
}
hasPermissionOrOwn(string $permissionSlug, Model $resource): bool
Kullanıcının genel permission'a veya .own permission'a sahip olup olmadığını kontrol eder:
if ($user->hasPermissionOrOwn('users.view', $targetUser)) {
// Kullanıcı users.view veya users.view.own permission'ına sahip
// VEYA kaynak sahibi
}
canManageResource(string $permissionSlug, ?Model $resourceOwner): bool
Kaynak sahibi kontrolü ile permission kontrolü yapar:
if ($user->canManageResource('users.update', $targetUser)) {
// Kullanıcı users.update permission'ına sahip
// VEYA kaynak sahibi ve users.update.own permission'ına sahip
}
Permission Pattern'leri
Standart Pattern'ler
| Pattern | Kullanım | Örnek |
|---|---|---|
{module}.manage | Modül tam yetki | users.manage |
{module}.view | Modül görüntüleme | users.view |
{module}.view.own | Kendi kaynaklarını görüntüleme | users.view.own |
{module}.create | Modül oluşturma | users.create |
{module}.create.own | Kendi kaynaklarını oluşturma | users.create.own |
{module}.update | Modül güncelleme | users.update |
{module}.update.own | Kendi kaynaklarını güncelleme | users.update.own |
{module}.delete | Modül silme | users.delete |
{module}.delete.own | Kendi kaynaklarını silme | users.delete.own |
{module}.restore | Modül geri yükleme | users.restore |
{module}.restore.own | Kendi kaynaklarını geri yükleme | users.restore.own |
Özel Pattern'ler
Bazı modüller özel permission pattern'leri kullanabilir:
admin.manage- Admin yönetim işlemleriroles.assign- Rol atamaroles.revoke- Rol kaldırmapermissions.assign- Permission atama
Best Practice'ler
1. Permission Kontrolü Her Zaman Yapılmalı
Tüm protected endpoint'lerde permission kontrolü yapılmalı:
public function store(Request $request)
{
$user = $request->user();
// Permission kontrolü
if (! $user->hasPermissionOrOwn('users.create')) {
return response()->json(['message' => 'Forbidden'], 403);
}
// İş mantığı
// ...
}
2. .own Permission'ları Kullanın
Kullanıcıların kendi kaynaklarını yönetmesine izin vermek için .own permission'larını kullanın:
// Liste endpoint'inde
if (! $user->hasPermission('users.view') && $user->hasPermission('users.view.own')) {
$query->where('user_id', $user->id);
}
3. Sistem Rolleri Kontrolü
Sistem rolleri tüm permission kontrollerini bypass eder:
// Sistem rolü kontrolü (otomatik yapılır)
if ($user->hasPermission('users.manage')) {
// Sistem rolleri için otomatik true döner
}
4. Permission Hiyerarşisi
Permission'lar priority değerine göre sıralanır. Kullanıcılar sadece kendi seviyelerinden düşük permission'ları yönetebilir:
// Permission atama kontrolü
if (! $user->canManagePermission($targetPermission)) {
return response()->json(['message' => 'Forbidden'], 403);
}
Örnekler
Örnek 1: Liste Endpoint'i
public function index(Request $request)
{
$user = $request->user();
// Permission kontrolü
if (! $user->hasPermissionOrOwn('users.view')) {
return response()->json(['message' => 'Forbidden'], 403);
}
$query = User::query();
// Sadece .own permission'ı varsa, kendi kayıtlarını göster
if (! $user->hasPermission('users.view') && $user->hasPermission('users.view.own')) {
$query->where('id', $user->id);
}
return response()->json($query->paginate());
}
Örnek 2: Detay Endpoint'i
public function show(Request $request, User $user)
{
$currentUser = $request->user();
// Permission kontrolü
if (! $currentUser->canManageResource('users.view', $user)) {
return response()->json(['message' => 'Forbidden'], 403);
}
return response()->json($user);
}
Örnek 3: Güncelleme Endpoint'i
public function update(Request $request, User $user)
{
$currentUser = $request->user();
// Permission kontrolü
if (! $currentUser->canManageResource('users.update', $user)) {
return response()->json(['message' => 'Forbidden'], 403);
}
$validated = $request->validate([
'email' => 'sometimes|email',
// ...
]);
$user->update($validated);
return response()->json($user);
}
İlgili Dokümantasyon
- RBAC Sistemi - RBAC sistem detayları
- RBAC API Referansı - API endpoint'leri