Birçok modern web uygulaması, birden fazla kullanıcı rolünü barındırır: yöneticiler, müşteriler, çalışanlar, satıcılar vb. Bu rollerin her biri farklı özelliklere ve erişim izinlerine sahiptir. Laravel, varsayılan olarak basit bir kimlik doğrulama sistemi sunsa da, çoklu kimlik doğrulama (multi-auth) yapısını kurarak farklı kullanıcı türleri için özelleştirilmiş oturum sistemleri oluşturabiliriz.
Bu yazıda, Laravel ile çoklu kimlik doğrulamanın mantığını, guards, providers, middleware ve özel giriş panelleriyle birlikte nasıl uygulanacağını adım adım göstereceğim.
1. Çoklu Auth Mimarisi Nedir?
Multi-auth sistemi, farklı kullanıcı türlerinin kendi kimlik doğrulama süreçlerine sahip olmasını sağlar. Örneğin:
-
/admin/login→ yalnızca admin kullanıcıları giriş yapar. -
/login→ normal kullanıcılar giriş yapar.
Bu yapı sayesinde güvenliği artırabilir, yetkileri ayrıştırabilir ve kullanıcı deneyimini özelleştirebilirsiniz.
2. Proje Kurulumu
Öncelikle bir Laravel projesi oluşturun:
laravel new multi-auth-demo
cd multi-auth-demo
Veritabanı ayarlarını .env dosyasından yapılandırmayı unutmayın.
3. Kullanıcı Rolleri için Migration Oluşturma
Varsayılan olarak users tablosu gelir. Şimdi admins tablosunu oluşturalım.
php artisan make:migration create_admins_table
Migration dosyasını şu şekilde düzenleyin:
Schema::create('admins', function (Blueprint $table) {
$table->id();
$table->string('name');
$table->string('email')->unique();
$table->timestamp('email_verified_at')->nullable();
$table->string('password');
$table->rememberToken();
$table->timestamps();
});
Migration’ı çalıştırın:
php artisan migrate
4. Admin Modelini Oluşturma
php artisan make:model Admin
Model dosyasını açın ve aşağıdaki gibi güncelleyin:
namespace App\Models;
use Illuminate\Foundation\Auth\User as Authenticatable;
use Illuminate\Notifications\Notifiable;
class Admin extends Authenticatable
{
use Notifiable;
protected $guard = 'admin';
protected $fillable = ['name', 'email', 'password'];
}
5. config/auth.php Dosyasını Düzenleme
'guards' => [
'web' => [
'driver' => 'session',
'provider' => 'users',
],
'admin' => [
'driver' => 'session',
'provider' => 'admins',
],
],
'providers' => [
'users' => [
'driver' => 'eloquent',
'model' => App\Models\User::class,
],
'admins' => [
'driver' => 'eloquent',
'model' => App\Models\Admin::class,
],
],
6. Admin için Giriş Sayfası ve Controller
php artisan make:controller Admin/Auth/LoginController
Controller:
namespace App\Http\Controllers\Admin\Auth;
use App\Http\Controllers\Controller;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;
class LoginController extends Controller
{
public function showLoginForm()
{
return view('admin.auth.login');
}
public function login(Request $request)
{
$credentials = $request->only('email', 'password');
if (Auth::guard('admin')->attempt($credentials)) {
return redirect()->intended('/admin/dashboard');
}
return back()->withErrors(['email' => 'Giriş bilgileri hatalı.']);
}
public function logout()
{
Auth::guard('admin')->logout();
return redirect('/admin/login');
}
}
7. Admin Giriş Sayfası
resources/views/admin/auth/login.blade.php:
<!DOCTYPE html>
<html>
<head>
<title>Admin Giriş</title>
</head>
<body>
<h2>Admin Paneli Giriş</h2>
<form method="POST" action="{{ route('admin.login') }}">
@csrf
<input type="email" name="email" placeholder="Email" required><br>
<input type="password" name="password" placeholder="Şifre" required><br>
<button type="submit">Giriş Yap</button>
</form>
</body>
</html>
8. Route Tanımları
routes/web.php:
// Admin Routes
Route::prefix('admin')->name('admin.')->group(function () {
Route::get('/login', [LoginController::class, 'showLoginForm'])->name('login');
Route::post('/login', [LoginController::class, 'login']);
Route::post('/logout', [LoginController::class, 'logout'])->name('logout');
Route::middleware('auth:admin')->group(function () {
Route::get('/dashboard', function () {
return 'Admin Dashboard';
})->name('dashboard');
});
});
// Normal User Routes
Auth::routes();
Route::get('/home', [App\Http\Controllers\HomeController::class, 'index'])->middleware('auth')->name('home');
9. Guard'a Özel Middleware Kullanımı
Bir route veya controller'ın sadece belirli bir guard (örneğin admin) tarafından erişilebilmesi için:
Route::middleware('auth:admin')->group(function () {
// admin protected routes
});
10. Oturum Çakışmalarını Önleme
Bir kullanıcı hem web hem admin guard ile aynı anda giriş yapabilir. Eğer tek oturum desteği istiyorsanız, login() metodunda diğer guardları logout() ile sıfırlayabilirsiniz.
Auth::guard('web')->logout();
Auth::guard('admin')->login($credentials);
Sonuç
Laravel ile çoklu kimlik doğrulama sistemi kurmak, büyük ve rollere ayrılmış uygulamalarda oldukça kritik bir yapıdır. Kullanıcıların ayrı giriş panellerine sahip olması, veri ve yetki yönetimini hem geliştirici hem kullanıcı açısından kolaylaştırır.
Bu yapıyı daha ileriye taşımak için aşağıdaki konuları da keşfedebilirsiniz:
-
Role & Permission sistemleri (Spatie Laravel Permission)
-
API Token tabanlı Multi-Auth sistemleri
-
Laravel Passport veya Laravel Sanctum ile kimlik doğrulama
