Web uygulamalarında yetkilendirme (authorization), kullanıcıların belirli işlemleri gerçekleştirme yetkilerini yönetmek için kullanılan bir mekanizmadır. Laravel, yetkilendirme işlemleri için Gate ve Policy adında iki güçlü yapı sunar.
- Gate: Tekil eylem bazlı yetkilendirme kontrolü sağlar.
- Policy: Model bazlı yetkilendirme mekanizmasıdır, belirli bir model üzerinde yetkilendirme işlemlerini tanımlar.
Bu yazıda, Laravel'de Gate ve Policy kullanarak nasıl gelişmiş yetkilendirme mekanizmaları oluşturabileceğinizi detaylı bir şekilde ele alacağız.
1. Gate Kullanımı ile Yetkilendirme
Gate, belirli eylemleri kontrol etmek için kullanılır. Örneğin, bir kullanıcının belirli bir sayfaya erişimini veya belirli bir işlemi gerçekleştirme yetkisini kontrol etmek için Gate tanımlayabilirsiniz.
Gate Tanımlama
Gate'leri genellikle AuthServiceProvider içerisinde tanımlarız.
app/Providers/AuthServiceProvider.php
use Illuminate\Support\Facades\Gate;
use App\Models\User;
class AuthServiceProvider extends ServiceProvider
{
public function boot()
{
Gate::define('manage-users', function (User $user) {
return $user->role === 'admin';
});
}
}
Bu kod, yalnızca role değeri admin olan kullanıcıların "manage-users" yetkisini kullanabilmesini sağlar.
Gate Kullanımı
Gate'leri kullanarak bir işlemi yetkilendirebiliriz:
1. Middleware içinde Kullanım
public function index()
{
if (Gate::denies('manage-users')) {
abort(403, 'Bu işlemi gerçekleştirme yetkiniz yok.');
}
return view('users.index');
}
Eğer kullanıcı "manage-users" yetkisine sahip değilse, 403 Forbidden hatası döner.
2. Blade Template İçinde Kullanım
Blade şablonlarında @can ve @cannot direktifleri ile Gate'leri kontrol edebilirsiniz:
@can('manage-users')
<a href="{{ route('admin.dashboard') }}">Admin Panel</a>
@endcan
@cannot('manage-users')
<p>Yetkiniz yok</p>
@endcannot
Burada, @can direktifi ile yalnızca yetkisi olan kullanıcılar için Admin Paneli linki gösterilir.
2. Policy Kullanımı ile Yetkilendirme
Policy, belirli bir model için yetkilendirme işlemlerini tanımlamak amacıyla kullanılır. Policy kullanımı, daha büyük projelerde yetkilendirme işlemlerini organize bir şekilde yönetmeyi sağlar.
Policy Oluşturma
php artisan make:policy PostPolicy --model=Post
Bu komut, app/Policies/PostPolicy.php dosyasını oluşturur.
app/Policies/PostPolicy.php
namespace App\Policies;
use App\Models\User;
use App\Models\Post;
class PostPolicy
{
/**
* Kullanıcı, belirli bir yazıyı güncelleyebilir mi?
*/
public function update(User $user, Post $post)
{
return $user->id === $post->user_id;
}
/**
* Kullanıcı, yazı silebilir mi?
*/
public function delete(User $user, Post $post)
{
return $user->id === $post->user_id;
}
}
Burada, sadece yazının sahibi olan kullanıcının yazıyı güncelleyebileceği ve silebileceği belirtildi.
Policy'yi Yetkilendirme Servisine Tanıtma
app/Providers/AuthServiceProvider.php dosyasına aşağıdaki tanımlamayı ekleyin:
use App\Models\Post;
use App\Policies\PostPolicy;
class AuthServiceProvider extends ServiceProvider
{
protected $policies = [
Post::class => PostPolicy::class,
];
public function boot()
{
$this->registerPolicies();
}
}
Bu kod, Post modeli için PostPolicy'yi Laravel'e tanıtır.
Policy Kullanımı
1. Controller İçinde Kullanım
public function update(Request $request, Post $post)
{
$this->authorize('update', $post);
$post->update($request->all());
return redirect()->route('posts.index')->with('success', 'Yazı güncellendi.');
}
Eğer yetkilendirme başarısız olursa, Laravel otomatik olarak 403 Forbidden hatası döndürür.
2. Blade Şablonlarında Kullanım
@can('update', $post)
<a href="{{ route('posts.edit', $post) }}">Düzenle</a>
@endcan
@can('delete', $post)
<form action="{{ route('posts.destroy', $post) }}" method="POST">
@csrf
@method('DELETE')
<button type="submit">Sil</button>
</form>
@endcan
Bu kod, yalnızca yazının sahibi olan kullanıcılara "Düzenle" ve "Sil" seçeneklerini gösterir.
3. Middleware ile Rol Bazlı Yetkilendirme
Laravel'de middleware kullanarak rol bazlı yetkilendirme mekanizması da oluşturabilirsiniz.
Middleware Oluşturma
php artisan make:middleware RoleMiddleware
app/Http/Middleware/RoleMiddleware.php
namespace App\Http\Middleware;
use Closure;
use Illuminate\Http\Request;
class RoleMiddleware
{
public function handle(Request $request, Closure $next, $role)
{
if ($request->user()->role !== $role) {
abort(403, 'Yetkiniz yok.');
}
return $next($request);
}
}
Bu middleware, sadece belirli bir role değeri olan kullanıcıların ilgili sayfalara erişmesine izin verir.
Middleware'i Route'larda Kullanma
Kernel.php içinde middleware'i kaydedin:
protected $routeMiddleware = [
'role' => \App\Http\Middleware\RoleMiddleware::class,
];
Şimdi middleware'i route'larda kullanabilirsiniz:
Route::get('/admin', function () {
return view('admin.dashboard');
})->middleware('role:admin');
Bu route'a yalnızca role = admin olan kullanıcılar erişebilir.
Sonuç
Laravel'in Gate ve Policy mekanizmaları ile gelişmiş yetkilendirme işlemleri gerçekleştirebilirsiniz. Gate basit yetkilendirme kontrolleri için uygunken, Policy model bazlı yetkilendirme için daha organize bir yapı sunar. Ayrıca, middleware kullanarak rol bazlı erişim kontrollerini de kolayca yönetebilirsiniz.
Bu rehber ile projelerinizde yetkilendirme süreçlerini daha güvenli ve esnek hale getirebilirsiniz. Eğer projenizde daha karmaşık yetkilendirme gereksinimleri varsa, bu sistemleri bir arada kullanabilirsiniz.
