Berikut adalah tutorial lengkap untuk membuat Multi-Authentication System di Laravel, di mana kita memiliki dua jenis pengguna: Admin dan User biasa. Sebelum ke tutorial, simak juga tutorial sebelumnya Cara generate HTML data ke dalam format PDF di Laravel dengan dompdf. Multi Auth Ini berguna jika Anda ingin mengelola pengguna dengan akses berbeda pada aplikasi, misalnya untuk keperluan dashboard admin dan user.

1. Persiapan Proyek dan Instalasi

Jika Anda belum memiliki proyek Laravel, buat proyek baru atau buka proyek yang sudah ada.

composer create-project laravel/laravel multi-auth-system 
cd multi-auth-system

2. Konfigurasi Database

Sesuaikan konfigurasi database Anda di .env:

DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=multi_auth
DB_USERNAME=root
DB_PASSWORD=

Jalankan php artisan migrate untuk membuat tabel-tabel dasar yang diperlukan oleh Laravel.

3. Menambahkan Kolom role di Tabel Users

Tambahkan kolom role pada tabel users untuk membedakan antara admin dan user biasa. Untuk ini, buat migration baru:

php artisan make:migration add_role_to_users_table --table=users

Edit migration tersebut di database/migrations/<timestamp>_add_role_to_users_table.php:

public function up()
{
    Schema::table('users', function (Blueprint $table) {
        $table->string('role')->default('user'); // nilai default sebagai 'user'
    });
}

Jalankan migration:

php artisan migrate

4. Menambahkan seed Data Admin dan User Biasa

Tambahkan beberapa data awal untuk admin dan user. Edit file DatabaseSeeder.php di folder database/seeders/DatabaseSeeder.php:

use App\Models\User;
use Illuminate\Support\Facades\Hash;

public function run()
{
    // Admin user
    User::create([
        'name' => 'Admin User',
        'email' => 'admin@example.com',
        'password' => Hash::make('password'),
        'role' => 'admin',
    ]);

    // Regular user
    User::create([
        'name' => 'Regular User',
        'email' => 'user@example.com',
        'password' => Hash::make('password'),
        'role' => 'user',
    ]);
}

Jalankan seeder:

php artisan db:seed

Jika berhasil, data akan otomatis insert di database seperti berikut:

5. Tambahkan Scaffolding untuk Autentikasi

Jika belum, anda bisa menambahkan package Laravel Breeze untuk autentikasi sederhana:

composer require laravel/breeze --dev 
php artisan breeze:install

Jika muncul pertanyaan seperti ini, kita akan pilih blade

Setelah itu, jalankan perintah di bawah untuk migrasi dan memasang dependensi front-end jika diperlukan:

php artisan migrate 
npm install && npm run dev

Ini akan men-generate semua route, controller, dan view yang diperlukan untuk login, register, serta logout.

6. Update AuthenticatedSessionController untuk Redirect Berdasarkan Role

Untuk mengarahkan pengguna ke dashboard yang berbeda berdasarkan peran (role), kita bisa mengedit AuthenticatedSessionController. Temukan controller ini di app/Http/Controllers/Auth/AuthenticatedSessionController.php.

Tambahkan logika berikut di method store:

namespace App\Http\Controllers\Auth;

use App\Http\Controllers\Controller;
use Illuminate\Http\RedirectResponse;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;
use Illuminate\View\View;
use Illuminate\Support\Facades\Validator;

class AuthenticatedSessionController extends Controller
{
    /**
     * Display the login view.
     */
    public function create(): View
    {
        return view('auth.login');
    }

    /**
     * Handle an incoming authentication request.
     */
    // Method store untuk login
    public function store(Request $request)
    {
        // Validasi input dari form login
        $credentials = $request->only('email', 'password');

        $validator = Validator::make($credentials, [
            'email' => 'required|email',
            'password' => 'required'
        ]);

        if ($validator->fails()) {
            return back()->withErrors($validator)->withInput();
        }

        // Proses login
        if (Auth::attempt($credentials)) {
            $request->session()->regenerate();

            // Redirect berdasarkan role
            $role = Auth::user()->role;
            if ($role === 'admin') {
                return redirect()->intended('/admin/dashboard');
            } else {
                return redirect()->intended('/user/dashboard');
            }
        }

        // Jika login gagal
        return back()->withErrors([
            'email' => 'The provided credentials do not match our records.',
        ])->withInput();
    }

    /**
     * Destroy an authenticated session.
     */
    public function destroy(Request $request): RedirectResponse
    {
        Auth::guard('web')->logout();

        $request->session()->invalidate();

        $request->session()->regenerateToken();

        return redirect('/');
    }
}

7. Update Middleware untuk Multi-Authentication

Buat middleware baru untuk memastikan pengguna memiliki peran tertentu. Gunakan perintah berikut:

php artisan make:middleware RoleMiddleware

Di app/Http/Middleware/RoleMiddleware.php, tambahkan:

namespace App\Http\Middleware;

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

class RoleMiddleware
{
    public function handle(Request $request, Closure $next, $role)
    {
        if (Auth::check() && Auth::user()->role === $role) {
            return $next($request);
        }

        // Redirect jika user tidak memiliki akses
        return redirect('/')->with('error', 'Access denied.');
    }
}

Tambahkan middleware ke Kernel.php:

protected $middlewareAliases = [
    // Middleware lain
    'role' => \App\Http\Middleware\RoleMiddleware::class,
];

8. Konfigurasi Routes untuk Admin dan User

Di routes/web.php, tambahkan route untuk admin dan user:

use Illuminate\Support\Facades\Route;

// Route untuk dashboard User
Route::middleware(['auth', 'role:user'])->group(function () {
    Route::get('/user/dashboard', function () {
        return view('user.dashboard');
    })->name('user.dashboard');
});

// Route untuk dashboard Admin
Route::middleware(['auth', 'role:admin'])->group(function () {
    Route::get('/admin/dashboard', function () {
        return view('admin.dashboard');
    })->name('admin.dashboard');
});

9. Membuat View untuk Admin dan User

Buat dua folder di dalam resources/views untuk memisahkan view user dan admin.

Admin Dashboard
Buat resources/views/admin/dashboard.blade.php:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Admin Dashboard</title>
</head>
<body>
    <h1>Welcome to Admin Dashboard</h1>
    <p>Only accessible by admin users.</p>

    <!-- Tombol Logout -->
    <form action="{{ route('logout') }}" method="POST" style="display: inline;">
        @csrf
        <button type="submit">Logout</button>
    </form>
</body>
</html>

User Dashboard
Buat resources/views/user/dashboard.blade.php:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>User Dashboard</title>
</head>
<body>
    <h1>Welcome to User Dashboard</h1>
    <p>Only accessible by regular users.</p>

    <!-- Tombol Logout -->
    <form action="{{ route('logout') }}" method="POST" style="display: inline;">
        @csrf
        <button type="submit">Logout</button>
    </form>
</body>
</html>

10. Menyembunyikan Link Berdasarkan Role

Tambahkan menu atau link yang hanya terlihat jika pengguna memiliki role tertentu. Misalnya, di file resources/views/layouts/app.blade.php:

<nav>
    <ul>
        @auth
            @if(Auth::user()->role === 'admin')
                <li><a href="{{ route('admin.dashboard') }}">Admin Dashboard</a></li>
            @endif
            @if(Auth::user()->role === 'user')
                <li><a href="{{ route('user.dashboard') }}">User Dashboard</a></li>
            @endif
            <li><a href="{{ route('logout') }}">Logout</a></li>
        @endauth
    </ul>
</nav>

11. Test Multi-Authentication

Admin Login: Coba login menggunakan email admin@example.com dengan password password. Seharusnya Anda diarahkan ke Admin Dashboard.

User Login: Coba login menggunakan email user@example.com dengan password password. Seharusnya Anda diarahkan ke User Dashboard.

12. Membuat Halaman Error untuk Unauthorized Access

Jika pengguna mencoba mengakses halaman yang bukan untuk role mereka, mereka akan melihat error 403. Anda bisa membuat tampilan yang lebih baik untuk ini di resources/views/errors/403.blade.php:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>403 - Unauthorized</title>
</head>
<body>
    <h1>403 - Unauthorized</h1>
    <p>Anda tidak memiliki izin untuk mengakses halaman ini.</p>
    <a href="{{ url('/') }}">Kembali ke Home</a>
</body>
</html>

Silahkan akses URL http://localhost:8000/login dan login menggunakan credential yang telah dibuat

Jika berhasil, untuk akun admin, akan menghasilkan berikut:


Sedangkan untuk akun user, akan menghasilkan seperti berikut:

SELAMAT MENCOBA!! Silahkan komen jika mengalami kendala.