Laravel’de Authorization (Yetki) İşlemleri

Laravel’de Authorization (Yetki) İşlemleri

Merhaba,
Bu yazımızda laravel’de yetkilendirmelere bir katmanda daha ekleyerek kullanıcılarımızın kendine ait veya kendi yetkisine ait olmayan içerikleri engellemeden bahsedeceğim. Aslında bu işlemleri Controller’den yapabilme ihtimalimiz var fakat bu işlem hem bizim için yorucu hemde zahmetli bir işlem.
Gelin şimdi laravel’in bize sunmuş olduğu Authorization işlemlerine Policy Ekleyerek kontrol edelim.
Öncelikle şunu belirtiyim alt kısımdaki anlatımlarım 5.2 sürümüne aittir 5.3 ve üstü için bir kaç kolaylık daha geldiğini dökümantasyon’dan gördüm, 5.2 üstü sürüm kullanıyorsanız lütfen dökümantasyonu inceleyiniz.
İlk olarak bu işleme Policy eklemeden yapabileceğimiz şekline bakalım.
AuthServiceProvider ‘ı açıyoruz ve boot methodunu buluyoruz.

Bu işlemden sonra içerisine alt kısımdaki gibi bir kod blogu ekliyoruz.

    public function boot(GateContract $gate)
    {
        $this->registerPolicies($gate);
        $gate->define('update-post', function ($user, $post) {
            return $user->id == $post->user_id;
        });
    }

Gelin şimdi üst kısımdaki uyguladığımız yetki işlemine bakalım define ile sabit bir değişken atadık ve adına update-post ismini verdik ve fonksiyon içerisinden $user ve $post olarak iki değer geçirdik return işleminde ise bu gelen değişkenlerden id ve user_id’yi karşılaştırıp bir değer çevirdik. Daha açıklayıcı olursak User tablomuzda’ki id kolonu ile Post tablosunda’ki user_id ‘yi karşılaştırıp true veya false çevirmesini sağladı.
Bu işlemden sonra benim genel olarak kullandığım kontrolü ise controller üzerinden yapıyorum. Bunun için kontrolünü yapacağımız controllerin methoduna giderek en üst kısmına alt kısımdaki kod blogunu ekliyoruz.

    public function update($id)
    {
        if (Gate::denies('update-post', Post::findOrFail($id))) {
            abort(403);
        }
        // Update Post...
    }

Yukarıdaki kod’u inceleyelim, update method’una gelen $id değişkenini update-post sabit değişkenine Post modelinin findOrFail method’u ile gönderim yapıyor eğer burada id = 5 ; ilgili post’un user_id = 6 ise bizi 403 sayfasına yönlendiriyor ve işlem yapmamıza engel oluyor.
Örneğin view katmanında düzenleme butonunu kaldırmak için ise alt kısımdaki kod’u inceleyebiliriz.

@can('update-post', $post)
    <a href="/post/{{ $post->id }}/edit">Edit Post</a>
@endcan

Gelin üst kısımda Policies eklemeden sağladığımız yetki işleminiz Policies ekleyerek yapalım.
Bu kısımda öncelikle php artisan komutlarını kullanarak bir Policy oluşturalım.

php artisan make:policy PostPolicy

Policy oluşturduktan sonra alt kısımdaki kod’u class içerine yazalım.

    public function update(User $user, Post $post)
    {
        return $user->id === $post->user_id;
    }

Üst kısımdaki kod ise üst kısımdaki anlattığımız sabit değişkenli işlemin birebir aynısı yapmaktadır.
Şimdi ise bu policy laravel’e tanıtalım bunun için AuthServiceProvider.php açarak alt kısımdaki görseldeki gibi kod’u ekleyelim.

    protected $policies = [
        'App\Post' => 'App\Policies\PostPolicy',
    ];

Daha sonraki işlemimiz ise controller üzerinde gerekli kontrolleri sağlamak olacaktır.

    public function update($id)
    {
         if (Gate::denies('update', Post::findOrFail($id))) {
            abort(403);
        }
        // Update Post...
    }

veya

    public function update($id)
    {
        $this->authorize('update', Post::findOrFail($id));
        // Update Post...
    }

veya
(Alt kısımdaki otomatik olarak policy adınızı model ismi kabul etmektedir.)

    public function update($id)
    {
    $this->authorize(Post::findOrFail($id));
    }

Üst kısımda ise daha üst kısımdaki anlattığımız sabit değişkenli işlemin birebir aynısı yapmaktadır.
İlgili model’de ise daha yüksek kontrol için alt kısımdaki can fonksiyonu ile kontrol sağlayabilirsiniz.

if ($user->can('update', $post)) {
    //
}

View katmanında kontrolünü ise;

@can('update', $post)
    <!-- The Current User Can Update The Post -->
@endcan

Daha ayrıntılı bilgi için laravel dökümantasyonunu inceleyebilirsiniz.
Yararlı olabildiysem ne mutlu, Hatam var ise bildirilirse düzeltebilirim.

Beğen  1
Yazar

2008, Yılından beri sistem ve yazılım teknolojileri ile ilgilenmekteyim. Ayrıntılı bilgi için hakkımda sayfamı inceleyebilirsiniz.

Bir Cevap Yazın

E-posta hesabınız yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir

Yapılan Yorumlar ( 3 )