Merhabalar,


Bu yazıda Laravel'de middleware kullanarak rol bazlı yetkilendirme işleminin nasıl yapılabileceğinden bahsedeceğim. Daha açık olmak gerekirse bu işlem sayesinde, örneğin Laravel'de bir Rest Api projesi geliştirirken "şu api'ye sadece şu role/rollere sahip kullanıcılar istekte bulunabilsin" diyebileceğiz.


Bu işlemi anlatırken daha önceden Laravel'de Passport kullanımı yazısında oluşturduğum proje üzerinden gideceğim. Bu yüzden eğer okuyup uygulamadıysanız öncelikle o yazıdakileri uygulamanızı tavsiye ederim.


İlk olarak register api'sine bir istekte bulunup kullanıcı kaydı yapıyorum. Sonrasında veritabanında bulunan users tablosuna role adında bir sütun ekliyorum. Ve mevcut kullanıcıma 1 rolünü veriyorum:



app/Http/Middleware klasörünü açarak CheckRole.php adında bir dosya oluşturuyorum ve içeriğini şu şekilde dolduruyorum:

<?php

namespace App\Http\Middleware;

use Closure;
use Illuminate\Support\Facades\Auth;

class CheckRole
{
    public function handle($request, Closure $next, $roles)
    {
        $user = Auth::user();
        $need_roles = explode('|', $roles);
        if (in_array($user->role, $need_roles)) {
            return $next($request);
        }
        return response()->json(['message' => 'Yetkisiz giriş'], 401);
    }
}

Burada yapmış olduğumuz işlem şunu ifade ediyor; giriş yapan kullanıcının rol bilgisi istenilen rollerden birine sahipse işleme devam et, değilse 'Yetkisiz giriş' şeklinde hata mesajı döndür.


Oluşturduğumuz middleware'ı app/Http/Kernel.php dosyasının routeMiddleware kısmında tanımlıyoruz:

'roles' => \App\Http\Middleware\CheckRole::class


api.php dosyasını açarak deneme api'sine middleware'ı ekliyoruz:

Route::group(['middleware' => 'auth:api'], function () {
    Route::get('deneme', 'UserController@deneme')->middleware('roles:1|2');
});


Artık deneme api'sine sadece 1 veya 2 rolündeki kullanıcılar istekte bulunabilecek. Postman üzerinden deneyerek sonucu görebilirsiniz.


İyi çalışmalar.