Laravel'de Policy ve Gate Kullanımı ile Gelişmiş Yetkilendirme

L

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.

By Aydın Yağız

Aydın Yağız

Teknolojiye olan tutkumla inovasyonu destekler, kullanıcı deneyimini önceliklerim arasına alırım. Kendi yeteneklerimi ve bilgilerimi paylaşarak, daha geniş bir topluluğun faydalanmasını sağlarım. İş birliği içinde hareket ederek, geleceğin teknoloji dünyasına katkıda bulunmayı hedeflerim. Sizi de bu heyecan verici yolculuğa davet ediyor, fikirlerinizi paylaşmaya ve teknolojiye dair sınırları zorlamaya teşvik ediyorum. Birlikte büyüyelim ve yeni ufuklara açılalım!

İletişime Geçin

Kodlama dünyasına adım atın ve deneyimlerinizi paylaşın. Siz de bu aktif topluluğa katılarak yeni bağlantılar kurun, fikir alışverişinde bulunun ve bilgi birikiminizi artırın.

Özelleştir

Farklı yazı tipleri ve renk seçenekleriyle stilinizi kişiselleştirin. Aşağıdaki örneklerden birini deneyerek sizin için en uygun olanı seçin.

Yazı Tipi Örnekleri

Renk Örnekleri