Laravel 8 Kullanıcı Tipleri Oluşturmak ve Girişini Ayırmak
#Laravel, #PHP, #Laravel 8 User Roles, #Laravel 8 Kullanıcı RolleriLaravel 8 üzerinde bildiğiniz üzere gelen hazır bir auth paketi mevcut. Bu auth paketi üzerinde rollere göre giriş sonrası panelleri değiştiremiyoruz. Bunun için kodlarda değişiklik yaparak projemizi uygun hale getirmemiz gerekmektedir.
Laravel projesi nasıl oluşturulur?
İlk önce Laravel projemizi oluşturmamız gerekmektedir. Bu işlem için aşağıdaki komutları terminalden çalıştırabilirsiniz.
$ curl -s https://laravel.build/example-app | bash
example-app kısmı yerine kendi uygulama isminizi yazabilirsiniz. Projeniz o şekilde oluşacaktır. Ardından Laravel Breeze yani temel auth paketini ekleyelim. Bunun için composer’a ihtiyacımız var.
$ composer require laravel/breeze –dev
Bu komutun ardından breeze paketimizi sisteme ekledik ancak kurulum halen bitmedi. Şu komutları da giriyoruz. Tabii ki öncesinde .env dosyanızı veritabanına bağlamayı unutmayınız. Eğer sisteminizde MySQL/MariaDB kurulumu mevcut değil ise sitemdeki Devilbox kurulumu makalesine bakabilir veya Laravel Sail kullanımını araştırabilirsiniz.
$ php artisan breeze:install
$ npm install
$ npm run dev
$ php artisan migrate
Bu kurulumları yaptıktan sonra Laravel uygulamamızda sorunsuz şekilde /register, /login gibi rotaların otomatik tanımlandığını göreceksiniz.
Laravel ile kullanıcı tiplerini ayırmak
Kullanıcılarımızın tiplerini veritabanı üzerinde belirleyelim. Doğru yol bu olmasa da ben anlatımda anlaşılır ve kolay olması için direkt users tablosu üzerine ekleme yapacağım ancak optimal yol farklı bir tablo üzerinde user_roles tarzı bir tablo oluşturup model üzerinden çağırma işlemini yapmaktır. Bu yol ile default entryler için ekstradan bir sütun oluşturmamış olacaksınız.
Users tablosuna ben user_type isminde bir kısım ekledim. Database/migrations klasörünüz altından users dosyanızı bulunuz ve password altına aşağıdaki kod satırını ekleyiniz.
$table->string('user_type')->default('customer');
Benim sistemimde customer, booster ve superuser tipinde üç kullanıcı olacağı için default kısmını customer olarak tanımladım. Siz bu tipleri projeniz için kendinize göre belirlemelisiniz. Bu migration değişikliği sonrası şu komutu çalıştırın.
$ php artisan migrate:refresh
Şimdi rotalarımızı oluşturmamız gerekiyor. Ben şu şekilde oluşturmayı tercih ettim.
Route::get('/customer', function () {
return view('dashboard');
})->middleware(['auth'])->name('customer');
Route::get('/booster', function () {
return view('dashboard');
})->middleware(['auth', 'role:booster'])->name('booster');
Route::get('/superuser', function () {
return view('dashboard');
})->middleware(['auth', 'role:superuser'])->name('superuser');
Gördüğünüz üzere kodlarımızda roller için özel bir middleware tanımlamışım. Hemen oluşturalım.
$ php artisan make:middleware CheckIfHasRole
Oluşan dosyamızın içeriğini aşağıdaki gibi tanımlayalım.
public function handle(Request $request, Closure $next, $type)
{
if (auth()->check() && auth()->user()->user_type == "superuser") {
return $next($request);
}
if (auth()->check() && auth()->user()->user_type == $type) {
return $next($request);
}
return redirect(route('index'))->withErrors([$type. ' erişiminiz yok.', 'Kullanıcı: ' . auth()->user()->id]);
}
Ardından App/Http/Kernel.php dosyamızı açalım. $routeMiddleware değişkenine yeni bir key, value ekleyelim.
'role' => \App\Http\Middleware\CheckIfHasRole::class,
Bu işlemi yaptıktan sonra rotalarımızın sorunsuz çalıştığından emin olalım. Denediğinizde bir problem olmaması gerekiyor. Şimdi login olduğumuzda her seferinde /dashboard altına giriş yapmaya çalıştığını farkedeceksiniz. Bunu da düzeltmemiz gerekiyor. Bunun için App/Providers/RouteServiceProvider.php dosyasını açalım.
Bu dosya içerisinde şu satırın altına kendi fonksiyonumuzu yazacağız.
public const HOME = '/customer';
public static function redirectTo() {
if (auth()->user()->user_type == "booster") {
return "/booster";
}
if (auth()->user()->user_type == "superuser") {
return "/superuser";
}
return "/customer";
}
Şeklinde fonksiyonumuzu ekleyelim. Bu fonksiyon rollerimize göre yönlenmemiz gereken adresleri düzenleyecek. Şimdi fonksiyonu işleme sokmak için App/Http/Controllers/Auth altındaki tüm dosyalarda RouteServiceProvider::HOME
yerine RouteServiceProvider::redirectTo()
yazmamız gerekmekte. Bu değişiklik için VSCode ile projenizde home değişkenini aratıp hepsini redirectTo() ile değiştirmesini sağlayabilirsiniz.
Bu işlemlerin hepsini doğru şekilde yaptığınızda Laravel 8 üzerinde kullanıcı tiplerinin girişini birbirinden ayırmış olacaksınız. Sorularınız için yorum bölümünü kullanabilirsiniz.