Pada tutorial kedua ini, kita akan belajar tentang authentikasi user. Di sini ada user admin, dan ada user public. Pada modul ini, secara umum ada 3 komponen berikut :
- Menggunakan Laravel Breeze untuk setup autentikasi dasar.
- Menambahkan middleware untuk membedakan akses admin dan user.
- Membuat halaman login dan dashboard terpisah untuk admin dan user.
Langkah 1: Menggunakan Laravel Breeze untuk Setup Autentikasi
Instal Laravel Breeze:
Laravel Breeze menyediakan scaffolding autentikasi yang sederhana, cepat, dan efisien. Untuk menginstalnya, jalankan perintah berikut:
composer require laravel/breeze --dev
Install dan Generate Scaffolding:
Setelah berhasil menginstal Laravel Breeze, jalankan perintah di bawah ini untuk membuat scaffolding autentikasi:
php artisan breeze:install
Kita akan menggunakan blade untuk stack nya.
Jalankan Migrate:
Jalankan migrasi untuk membuat tabel users yang dibutuhkan oleh autentikasi.
php artisan migrate
Jalankan npm:
Jalankan perintah berikut untuk meng-compile assets yang dibutuhkan untuk tampilan autentikasi.
npm install && npm run dev
Langkah 2: Menambahkan Kolom Role di Tabel Users
Tambah Kolom role di Tabel users:
Buka file migration create_users_table.php dan tambahkan kolom role dengan nilai default user.
$table->string('role')->default('user'); // bisa user atau admin
Full code untuk file create_users_table.php sebagai berikut:
public function up(): void
{
Schema::create('users', function (Blueprint $table) {
$table->id();
$table->string('name');
$table->string('email')->unique();
$table->timestamp('email_verified_at')->nullable();
$table->string('password');
$table->string('role')->default('user'); // bisa user atau admin
$table->rememberToken();
$table->timestamps();
});
}
Migrasi Ulang Database:
Jalankan migrasi ulang agar kolom role ditambahkan:
php artisan migrate:fresh
Setup Seeder User dan Admin:
Tambahkan user dan admin di DatabaseSeeder.php untuk testing awal di file app\database\seeders\DatabaseSeeder.php
use App\Models\User;
User::create([
'name' => 'Admin',
'email' => 'admin@example.com',
'password' => bcrypt('password'),
'role' => 'admin',
]);
User::create([
'name' => 'User',
'email' => 'user@example.com',
'password' => bcrypt('password'),
'role' => 'user',
]);
Jalankan Seeder:
php artisan db:seed
Cek data di database, di tabel users, hasilnya seperti berikut:
Langkah 3: Menambahkan Middleware Role untuk Admin dan User
Buat Middleware Baru:
Jalankan perintah berikut untuk membuat middleware Admin.
php artisan make:middleware AdminMiddleware
Edit Middleware AdminMiddleware.php:
Buka file app/Http/Middleware/AdminMiddleware.php dan tambahkan logika berikut untuk membatasi akses hanya untuk admin.
namespace App\Http\Middleware;
use Closure;
use Illuminate\Http\Request;
class AdminMiddleware
{
public function handle(Request $request, Closure $next)
{
if (auth()->check() && auth()->user()->role === 'admin') {
return $next($request);
}
return redirect('/dashboard')->with('error', 'Access denied.');
}
}
Registrasikan Middleware:
Buka file app/Http/Kernel.php dan tambahkan middleware baru ke dalam array $routeMiddleware:
protected $middlewareAliases = [
// Middleware lainnya
'admin' => \App\Http\Middleware\AdminMiddleware::class,
];
Langkah 4: Setup Route dan Dashboard Khusus Admin dan User
Edit Route di web.php:
Tambahkan route admin/dashboard dan user/dashboard, dengan middleware yang sesuai.
use App\Http\Controllers\AdminController;
use App\Http\Controllers\UserController;
Route::get('/dashboard', [UserController::class, 'index'])->middleware(['auth', 'verified'])->name('dashboard');
Route::middleware(['auth', 'admin'])->group(function () {
Route::get('/admin/dashboard', [AdminController::class, 'index'])->name('admin.dashboard');
});
Buat Controller Admin dan User:
Buat controller AdminController dan UserController dengan perintah:
php artisan make:controller AdminController
php artisan make:controller UserController
Implementasi Method Dashboard di Controller:
UserController:
namespace App\Http\Controllers;
use Illuminate\Http\Request;
class UserController extends Controller
{
public function index()
{
return view('user.dashboard');
}
}
AdminController:
namespace App\Http\Controllers;
use Illuminate\Http\Request;
class AdminController extends Controller
{
public function index()
{
return view('admin.dashboard');
}
}
Edit file AuthenticatedSessionController.php
Buka file AuthenticatedSessionController.php di dalam app/Http/Controllers/Auth/. Edit Method store:
public function store(LoginRequest $request): RedirectResponse
{
$request->validate([
'email' => 'required|email',
'password' => 'required',
]);
if (Auth::attempt($request->only('email', 'password'))) {
$request->session()->regenerate();
// Cek role user dan arahkan ke halaman yang sesuai
if (Auth::user()->role === 'admin') {
return redirect()->intended('/admin/dashboard');
}
return redirect()->intended('/dashboard');
}
return back()->withErrors([
'email' => 'The provided credentials do not match our records.',
]);
}
Buat Halaman View untuk Admin dan User:
resources/views/admin/dashboard.blade.php:
Buat folder admin di dalam resources/views dan buat file dashboard.blade.php di dalamnya. isi code dashboard.blade.php sebagai berikut:
<h1>Welcome Admin!</h1>
<p>Ini adalah halaman dashboard khusus admin.</p>
resources/views/user/dashboard.blade.php:
Buat folder user di dalam resources/views dan buat file dashboard.blade.php di dalamnya.
<h1>Welcome User!</h1>
<p>Ini adalah halaman dashboard untuk user biasa.</p>
Langkah 5: Menambahkan Link Logout
Buat Tombol Logout di View:
Tambahkan link logout di layout.blade.php atau di setiap dashboard.
<form action="{{ route('logout') }}" method="POST"> @csrf <button type="submit">Logout</button> </form>
Cek Hasil Akhir
Silahkan coba buka http://localhost:8000/login, dan login sebagai admin, jika berhasil akan menghasilkan berikut:
Coba login sebagai user, dan pastikan user diarahkan ke /dashboard dan tidak dapat mengakses /admin/dashboard.
Dengan mengikuti langkah-langkah di atas, sekarang Anda telah menyelesaikan Modul Autentikasi Admin dan User dengan halaman dashboard terpisah sesuai dengan role.