İçeriğe geç

Laravel Gate – Policy Nedir ve Kullanımı

Laravel Gate ile istediğiniz sayfaları, componentları belirli kullanıcılara gösterip gizleyebilirsiniz. Gate’ler AuthServiceProvider.php dosyasında boot() metodunda tanımlanır.

Örnek olarak kullanıcıya sadece kendi adreslerini görüntüleme kontrolünü yapma;

<?php
Gate::define('user-own-address', function ($user, $addressid) { // $user giriş yapmış kullanıcı
$task = \App\Address::where('user_id', $user->id)->findOrFail($addressid);
return true;
});

Kontrol yapılacak yere eklenecek metod;

<?php
abort_unless(\Gate::allows('user-own-address',$address->id), 403);

Eğer $address->id kullanıcıya ait değilse hata gösterilecek.

Detaylı kullanım örneği(Şubeye ait kullanıcıların ibanını göster, iban kullanıcısı şubeye ait bölgede yer almıyorsa hata verir)

<?php
Gate::define('branch-own-iban', function ($user, $iban) {
            if ($iban->ibanable_type == 'App\Models\User') {
                \App\Models\Iban::whereHasMorph('ibanable', [\App\Models\User::class], function ($query) use ($user) {
                    $query->whereHas('address.district.branch', function ($query) use ($user) {
                        $query->where('branch_id', '=', $user->id);
                    });
                })->findOrFail($iban->id);
            } else {
                \App\Models\Iban::whereHasMorph('ibanable', [\App\Models\Courier::class], function ($query) use ($user) {
                    $query->whereHas('district.branch', function ($query) use ($user) {
                        $query->where('branch_id', '=', $user->id);
                    });
                })->findOrFail($iban->id);
            }
            return true;
        });

Policy ile de benzer işlemleri yapabilirsiniz. Policy oluşturma;

php artisan make:policy PostPolicy --model=Post

App\Policies dizininde oluşan dosyayı açın. Örnekte bir yazının crud işlemlerinde kullanıcı kontrolü yapılacaktır.

<?php
namespace App\Policies;

use App\User;
use App\Post;
use Illuminate\Auth\Access\HandlesAuthorization;

class PostPolicy
{
  use HandlesAuthorization;
  public function view(User $user, Post $post)
  {
    return TRUE;
  }
  public function create(User $user)
  {
    return $user->id > 0;
  }
  public function update(User $user, Post $post)
  {
    return $user->id == $post->user_id;
  }
  public function delete(User $user, Post $post)
  {
    return $user->id == $post->user_id;
  }
}

PostPolicy dosyasını Post modeliyle ilişkilendirmemiz gerekiyor. Bunun için AuthServiceProvider.php dosyasını açın ve düzenleyin.

<?php
namespace App\Providers;
use Illuminate\Foundation\Support\Providers\AuthServiceProvider as ServiceProvider;
use Illuminate\Http\Request;
use App\Post;
use App\Policies\PostPolicy;
class AuthServiceProvider extends ServiceProvider
{
  protected $policies = [
    'App\Model' => 'App\Policies\ModelPolicy',
    Post::class => PostPolicy::class
  ];
  public function boot()
  {
    $this->registerPolicies();
  }
}

Blade dosyalarında kullanımı ise şu şekildedir;

<?php
@can('delete', $post)
  // show post delete button
@endcan
@cannot('delete', $post)
  // disable post delete button
@endcannot


// using Policy in Model
@can('delete', $post)
  // show post delete button
@endcan
@cannot('delete', $post)
  // disable post delete button
@endcannot

Controller dosyasında kullanımı;

<?php
public function delete(Post $post)
{
  $this->authorize('delete', $post);
  // The current user can delete the post
}
Kategori:LaravelSecurity

İlk Yorumu Siz Yapın

Bir cevap yazın

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