Laravel: Yetkilendirme (Authorization)

Giriş

Dahili kimlik doğrulama (authentication) servisine ek olarak Laravel, kaynaklara erişim ve yetkilendirme mantığı için kolay bir yol sağlar. Yetkilendirmelerinizin organizasyonunda size yardımcı olacak ve herbirini bu dökümanda açıklayacağımız çeşitli metodlar ve yardımcılar vardır.

Not: Yetkilendirme, Laravel 5.1.11 versiyonunda eklenmiştir.

Yapabilirlik Tanımlama

Bir kullanıcının verilen işlevi icra edip edemeyeceğini belirlemenin en kolay yolu Illuminate\Auth\Access\Gate sınıfıını kullararak bir “yapabilirlik (ability)” tanımlamaktır. Laravel ile sunulan AuthServiceProvider servis sağlayıcı, uygulamanız için tüm yapabilirlikleri tanımlamak için uygun bir yerdir. Örneğin, mevcut User ve Post modelini alan update-post yapabilirliğini tanımlayalım. Yapabilirliğimizde, kullanıcının id‘sinin post modelinin user_id‘si ile eşleşip eşleşmediğini belirleyeceğiz.

Not olarak; $user değişkeninin NULL olup olmadığını kontrol etmedik. Gate, giriş yapmış bir kullanıcı olmadığında veya forUser metodu kullanılarak bir kullanıcı belirtilmediğinde tüm yapabililirlikler için otomatik olarak false döner.

Sınıf Bazlı Yapabilirlikler

Ek olarak isimsiz fonksiyonları yetkilendirme geri çağırması (callbacks) şeklinde eklemek yerine sınıf adı ve metodunu içeren bir yazıyla da kaydedebilsirsiniz. İhtiyaç duyulduğunda, sınıf servis taşıyıcısı yoluyla çözümlenecektir.

Tüm Kontroller Engellemek

Bazen, özel bir kullanıcı için tüm yapabilirlikleri aktifleştirmek isteyebilirsiniz. Bu durumda, before metodunu kullanın ve bunun için diğer yetkilendirme kontrollerinden önce çalışacak bir geri çağırma tanımlayın.

Yapabilirliklerin Doğrulanması

Gate Facade Kullanarak

Tanımmış bir yapabilirliği çeşitli yollarla doğrulayabiliriz. İlk olarak Gate facade üzerindeki check, allows veya denies metodlarını kullanabiliriz. Tüm bu metodlar yapılabilirliğin isimini ve yapabilirliğin geri çağrımına geçirilecek argümanları alır. Bu metodlara geçerli kullanıcıyı geçirmenize gerek yoktur.

allows metodu denies metodunun tersidir ve işlem yetkilendirilmişse true döndürülür. check metodu allows metodunun başka bir adıdır ve aynı işlevi yapar.

Yapabilirliğin Özel Kullanıcılar İçin Kontrol Edilmesi

Gate facade mevcut kullanıcının haricinde başka bir kullanıcının yapabilirliğini kontrol için kullanmak isterseniz, forUser metodunu kullanabilirsiniz.

Çoklu Argüman Geçirme

Yapabilirlik geri çağrımları çoklu argüman alabilir.

Yapabilirlik için çoklu argüman geçirmek gerekli ise, Gate metoduna argümanları dizi olarak geçirebilirsiniz.

“User” Modeli Yoluyla

Alternatif olarak, User model örneği yoluyla yapabilirliği kontrol edebilirsiniz. Varsayılan olarak, Laravel’in App\User modeli can ve cannot metodlarını sağlayan Authorizable özelliğini (trait) kullanır. Bu metodlar Gate facade ile kullanıllan allows ve denies metodlarına benzer şekilde kullanılabilir. Yani, bir önceki kullandığımız örneğimiz, şu şekilde değiştirilebilir.

can metodu, cannot metodunun tersi olarak kullanılabilir.

Blade Template İçinde Kullanımı

Kolaylık için Laravel, giriş yapmış bir kullanıcının verilen yapılabilirliği kolayca kontorl edebilmek için @code Blade yönergesi sağlar.

@can yönergesini @else yönergesini beraber de kullanabilirsiniz.

Form İsteklerinde Kullanım

Yapabilirliklerinizi form isteğinin authorize metodunu kullanarak da yapabilirsiniz. Örneğin:

Politikalar

Politika Yaratılması

Büyük uygulamalarda, tüm yetkilendirme mantığını AuthServiceProvider içinde yapmak kullanışsız olabilir. Laravel yetkilendirme mantığınızı “Politika (Policy)” sınıflarına ayırmanıza izin verir.

Önce, Post modelimize yetkilendirmeyi yönetmek için bir politika oluşturalım. make:policy artisan komutunu kullanarak yeni bir politika oluşturabilirsiniz. Oluşturulan politika app/Policies klasörüne konacaktır.

Politikaların Kaydedilmesi

Varolan politikayı, Gate sınıfında kaydetmemiz gerekir. AuthServiceProvider, policies özelliği içerir.

Politikalar Yazılması

Potilika oluşturulduktan ve kaydettikten sonra, yetkilendirilecek her yapabilirlik için bir metod ekleyebiliriz. Örneğin, verilen kullanıcının Post guncelleme yapıpıp yapamayacağına karar veren PostPolicy sınıfımızda “update” metodu tanımlayalım.

Politikaya ihtiyaç durduğunuz diğer yetelilikler için metodlar eklemeye devam edebilirsiniz. Örneğin, çeşitli Post işlemlerinin yetkilendirilmesi için show, destroy, addCommnent metodlar tanımlayabilirsiniz.

Tüm Kontroller Engellemek

Bazen, özel bir kullanıcı için tüm yapabilirlikleri aktifleştirmek isteyebilirsiniz. Bu durumda, before metodunu kullanın ve bunun için diğer yetkilendirme kontrollerinden önce çalışacak bir geri çağırma tanımlayın.

Politikaların Doğrulanması

Gate Facade Kullanarak

Tanımmış bir yapabilirliği çeşitli yollarla doğrulayabiliriz. İlk olarak Gate facade üzerindeki check, allows veya denies metodlarını kullanabiliriz. Tüm bu metodlar yapılabilirliğin isimini ve yapabilirliğin geri çağrımına geçirilecek argümanları alır. Bu metodlara geçerli kullanıcıyı geçirmenize gerek yoktur.

Blade Template İçinde Kullanımı

Kolaylık için Laravel, giriş yapmış bir kullanıcının verilen yapılabilirliği kolayca kontorl edebilmek için @code Blade yönergesi sağlar.

@can yönergesini @else yönergesini beraber de kullanabilirsiniz.