Laravel ile Çoklu Kimlik Doğrulama (Multi-Auth) Sistemleri

L

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

By Aydın Yağız

Aydın Yağız

Teknolojiye olan tutkumla inovasyonu destekler, kullanıcı deneyimini önceliklerim arasına alırım. Kendi yeteneklerimi ve bilgilerimi paylaşarak, daha geniş bir topluluğun faydalanmasını sağlarım. İş birliği içinde hareket ederek, geleceğin teknoloji dünyasına katkıda bulunmayı hedeflerim. Sizi de bu heyecan verici yolculuğa davet ediyor, fikirlerinizi paylaşmaya ve teknolojiye dair sınırları zorlamaya teşvik ediyorum. Birlikte büyüyelim ve yeni ufuklara açılalım!

İletişime Geçin

Kodlama dünyasına adım atın ve deneyimlerinizi paylaşın. Siz de bu aktif topluluğa katılarak yeni bağlantılar kurun, fikir alışverişinde bulunun ve bilgi birikiminizi artırın.

Özelleştir

Farklı yazı tipleri ve renk seçenekleriyle stilinizi kişiselleştirin. Aşağıdaki örneklerden birini deneyerek sizin için en uygun olanı seçin.

Yazı Tipi Örnekleri

Renk Örnekleri