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.