Laravel ‐ Middleware and Authentication in Laravel - johnverz22/appdev-lessons GitHub Wiki
Module 1: Introduction to Middleware
Objective:
Understand Laravel middleware and how it works for request handling.
Topics Covered:
-
What is Middleware?
- Role of middleware in Laravel.
- Types of middleware (global, route, and group middleware).
-
Creating Middleware in Laravel
- Generating middleware:
php artisan make:middleware CheckRole
- Handling request lifecycle in middleware:
public function handle(Request $request, Closure $next) { if (!$request->user() || !$request->user()->isAdmin()) { abort(403, 'Unauthorized access'); } return $next($request); }
- Generating middleware:
-
Registering Middleware
- Global middleware (
app/Http/Kernel.php
). - Route-specific middleware using
middleware()
in routes.
- Global middleware (
Module 2: API Authentication with Laravel Sanctum
Objective:
Implement authentication for API-only applications using Laravel Sanctum.
Topics Covered:
-
Installing Sanctum
- Install and publish Sanctum:
composer require laravel/sanctum php artisan vendor:publish --provider="Laravel\\Sanctum\\SanctumServiceProvider" php artisan migrate
- Install and publish Sanctum:
-
Configuring Sanctum
- Add Sanctum middleware in
app/Http/Kernel.php
:'api' => [ \Laravel\Sanctum\Http\Middleware\EnsureFrontendRequestsAreStateful::class, 'throttle:api', \Illuminate\Routing\Middleware\SubstituteBindings::class, ],
- Add Sanctum middleware in
-
Setting Up Authentication Routes
- Creating login and registration endpoints:
Route::post('/register', [AuthController::class, 'register']); Route::post('/login', [AuthController::class, 'login']); Route::middleware('auth:sanctum')->get('/user', [AuthController::class, 'user']);
- Creating login and registration endpoints:
-
Handling User Authentication in Controllers
-
Register method:
public function register(Request $request) { $validated = $request->validate([ 'name' => 'required|string|max:255', 'email' => 'required|string|email|max:255|unique:users', 'password' => 'required|string|min:8|confirmed', ]); $user = User::create([ 'name' => $validated['name'], 'email' => $validated['email'], 'password' => bcrypt($validated['password']), ]); $token = $user->createToken('auth-token')->plainTextToken; return response()->json(['token' => $token], 201); }
-
Login method:
public function login(Request $request) { if (!Auth::attempt($request->only('email', 'password'))) { return response()->json(['message' => 'Invalid credentials'], 401); } $user = Auth::user(); $token = $user->createToken('auth-token')->plainTextToken; return response()->json(['token' => $token], 200); }
-
-
Protecting API Routes with Sanctum Middleware
Route::middleware('auth:sanctum')->group(function () { Route::get('/profile', function (Request $request) { return response()->json($request->user()); }); });
-
Logging Out Users
public function logout(Request $request) { $request->user()->tokens()->delete(); return response()->json(['message' => 'Logged out']); }
Module 3: Full-Stack Authentication Using Laravel Breeze
Objective:
Implement full authentication using Laravel Breeze with Blade templates.
Topics Covered:
-
Installing Laravel Breeze
composer require laravel/breeze --dev php artisan breeze:install npm install && npm run dev php artisan migrate
-
Understanding Laravel Breeze
- Pre-built authentication (login, registration, password reset).
- Uses Laravel Blade templates.
-
Protecting Routes Using Middleware
- Applying authentication middleware:
Route::middleware(['auth', 'verified'])->group(function () { Route::get('/dashboard', function () { return view('dashboard'); }); });
- Applying authentication middleware:
-
Using Authentication Guards
- Switching between
web
andapi
guards inconfig/auth.php
:'defaults' => [ 'guard' => 'web', 'passwords' => 'users', ],
- Switching between
-
Restricting Access Based on User Role
- Middleware to restrict admin access:
public function handle(Request $request, Closure $next) { if ($request->user() && $request->user()->role !== 'admin') { return redirect('/dashboard'); } return $next($request); }
- Apply middleware to routes:
Route::middleware(['auth', 'role:admin'])->group(function () { Route::get('/admin', function () { return view('admin.dashboard'); }); });
- Middleware to restrict admin access:
Practice Problems
1. Middleware Practice
- Task: Create a middleware named
EnsureUserIsAdmin
that restricts access to certain routes for non-admin users. - Hint: Use
$request->user()->role
to check for an admin role.
2. API Authentication with Sanctum
- Task: Implement an API route
/user-profile
that returns the authenticated user's details only if they provide a valid token. - Hint: Use
auth:sanctum
middleware.
3. Laravel Breeze Login Flow
- Task: Modify the Laravel Breeze authentication to include an extra field in registration (e.g.,
phone_number
). - Hint: Update the
User
model's fillable properties and validation rules.
4. Role-Based Access
- Task: Create an
admin
panel where only users with anadmin
role can access/admin-dashboard
. - Hint: Use custom middleware and apply it to routes.
5. Logout for API Users
- Task: Implement a logout feature for API users using Sanctum.
- Hint: Use
$request->user()->tokens()->delete();
to delete all tokens.