📖 Scenario: You are building a Laravel web application that needs to restrict access to certain routes based on user roles. Middleware is a way to filter HTTP requests entering your app.In this project, you will create a middleware that checks if a user is an admin before allowing access to admin routes.
🎯 Goal: Build a middleware in Laravel named CheckAdmin that blocks users who are not admins from accessing admin routes.
📋 What You'll Learn
Create a middleware class named CheckAdmin
Add a configuration variable adminRole with the value admin
Implement the handle method to check if the authenticated user's role matches adminRole
Return a redirect to /home if the user is not an admin, otherwise allow the request to proceed
💡 Why This Matters
🌍 Real World
Middleware is used in real Laravel apps to control access, add security checks, and modify requests before they reach your controllers.
💼 Career
Understanding middleware is essential for backend Laravel developers to implement authentication, authorization, and request filtering.
Progress0 / 4 steps
1
Create the middleware class
Create a middleware class named CheckAdmin inside the app/Http/Middleware directory with a handle method that accepts $request and $next parameters.
Laravel
Hint
Use php artisan make:middleware CheckAdmin to generate the middleware class automatically, then open app/Http/Middleware/CheckAdmin.php to edit the handle method.
2
Add the admin role configuration variable
Inside the CheckAdmin class, add a protected property named adminRole and set it to the string 'admin'.
Laravel
Hint
Declare a protected property adminRole inside the class and assign it the value 'admin'.
3
Implement the admin check logic
Inside the handle method, write an if statement that checks if the authenticated user's role is not equal to $this->adminRole. If so, return a redirect to /home. Otherwise, return $next($request) to allow the request to continue.
Laravel
Hint
Use $request->user()?->role to get the current user's role safely. Redirect if not admin, else continue.
4
Register the middleware in the kernel
Open app/Http/Kernel.php and add the CheckAdmin middleware to the $routeMiddleware array with the key 'check.admin'.
Laravel
Hint
Register your middleware with a key in the $routeMiddleware array so you can use it in routes.
Practice
(1/5)
1. What is the primary purpose of middleware in Laravel?
easy
A. To define routes for the application
B. To filter and modify HTTP requests before they reach the controller
C. To create database migrations automatically
D. To generate views for the user interface
Solution
Step 1: Understand middleware role
Middleware acts as a filter that processes HTTP requests before they reach the controller or after the response leaves the controller.
Step 2: Identify correct purpose
Among the options, only filtering and modifying HTTP requests matches middleware's role.
Final Answer:
To filter and modify HTTP requests before they reach the controller -> Option B
Quick Check:
Middleware filters requests [OK]
Hint: Middleware filters requests before controllers [OK]
Common Mistakes:
Confusing middleware with routing
Thinking middleware creates database migrations
Assuming middleware generates views
2. Which command correctly creates a new middleware named CheckAge in Laravel?
easy
A. php artisan make:middleware CheckAge
B. php artisan create:middleware CheckAge
C. php artisan middleware:create CheckAge
D. php artisan generate:middleware CheckAge
Solution
Step 1: Recall Laravel artisan command for middleware
The correct command to create middleware is php artisan make:middleware Name.
Step 2: Match the command with options
Only php artisan make:middleware CheckAge uses the exact correct syntax.
Final Answer:
php artisan make:middleware CheckAge -> Option A
Quick Check:
Use 'make:middleware' to create middleware [OK]
Hint: Use 'make:middleware' with artisan to create middleware [OK]
Common Mistakes:
Using 'create:middleware' instead of 'make:middleware'
Mixing command order or keywords
Forgetting to specify middleware name
3. Given this middleware handle method, what will happen if the user is not authenticated?
public function handle($request, Closure $next) {
if (!auth()->check()) {
return redirect('login');
}
return $next($request);
}
medium
A. The request proceeds to the next middleware or controller
B. The request is blocked with a 403 Forbidden response
C. An error is thrown because of missing return
D. The user is redirected to the login page
Solution
Step 1: Analyze the authentication check
The code checks if the user is not authenticated using !auth()->check().
Step 2: Understand the redirect action
If not authenticated, it returns a redirect response to 'login', stopping further request processing.
Final Answer:
The user is redirected to the login page -> Option D
Quick Check:
Unauthenticated users get redirected [OK]
Hint: Redirect happens if auth check fails [OK]
Common Mistakes:
Assuming request proceeds despite failed auth
Thinking an error is thrown
Confusing redirect with 403 response
4. Identify the error in this middleware handle method:
public function handle($request, Closure $next) {
if ($request->user()->role !== 'admin') {
abort(403, 'Unauthorized');
}
}
medium
A. No error, this middleware is correct
B. Incorrect method name, should be handleRequest
C. Missing return statement for $next middleware call
D. Using abort() is not allowed in middleware
Solution
Step 1: Check middleware handle method structure
Middleware must return either a response or call $next($request) to continue the request.
Step 2: Identify missing return
This code aborts if role is not admin but does not return $next($request) if the user is admin, causing no response to be returned.
Final Answer:
Missing return statement for $next middleware call -> Option C
Quick Check:
Always return $next($request) to continue [OK]
Hint: Always return $next($request) in middleware [OK]
Common Mistakes:
Forgetting to return $next($request)
Thinking abort() is disallowed
Renaming handle method incorrectly
5. You want to create middleware that blocks requests with a query parameter blocked=true by aborting with a 403 Forbidden response. Which handle method implementation correctly achieves this?
hard
A. public function handle($request, Closure $next) {
if ($request->query('blocked') === 'true') {
abort(403, 'Access denied');
}
return $next($request);
}
B. public function handle($request, Closure $next) {
if ($request->input('blocked') == true) {
return redirect('home');
}
return $next($request);
}
C. public function handle($request, Closure $next) {
if ($request->blocked === true) {
abort(404);
}
return $next($request);
}
D. public function handle($request, Closure $next) {
if ($request->has('blocked')) {
return response('Blocked', 401);
}
return $next($request);
}
Solution
Step 1: Check how to read query parameters
Use $request->query('blocked') to get the query parameter value as string.
Step 2: Verify condition and response
public function handle($request, Closure $next) {
if ($request->query('blocked') === 'true') {
abort(403, 'Access denied');
}
return $next($request);
} checks if 'blocked' equals string 'true' and aborts with 403, then returns next middleware call.
Step 3: Compare other options
public function handle($request, Closure $next) {
if ($request->input('blocked') == true) {
return redirect('home');
}
return $next($request);
} uses input() and redirects instead of aborting; public function handle($request, Closure $next) {
if ($request->blocked === true) {
abort(404);
}
return $next($request);
} accesses property incorrectly; public function handle($request, Closure $next) {
if ($request->has('blocked')) {
return response('Blocked', 401);
}
return $next($request);
} returns 401 but blocks any 'blocked' param regardless of value.
Final Answer:
Checks $request->query('blocked') === 'true' and uses abort(403, 'Access denied') -> Option A
Quick Check:
Use $request->query('blocked') and abort(403) [OK]
Hint: Use $request->query('param') and abort(403) to block [OK]
Common Mistakes:
Using $request->blocked instead of query()
Returning redirect instead of abort
Not checking exact 'true' string value
Recommended
Ready to prove it?
Pass the test and this pattern moves unknownstrongwhile earning +1 Grip toward your certificate.