Install the Package
composer require webtoppings/ipwhitelisting
Publish Config & Migrations
php artisan vendor:publish --provider="WebToppings\IPWhitelisting\IPWhitelistingServiceProvider"
php artisan migrate
First Use Case: Restrict Admin Routes
Add the middleware to your routes/web.php or routes/api.php:
Route::middleware(['auth', 'IPBlocking'])->group(function () {
// Admin routes here
});
\WebToppings\IPWhitelisting\Middlewares\IPBlocking\WebToppings\IPWhitelisting\IPWhitelistingController (for managing whitelists)database/migrations/[timestamp]_create_ip_whitelists_table.phpWhitelist Management
/ipwhitelisting) to add/remove IPs via a CRUD interface.Route::prefix('admin')->middleware(['auth', 'IPBlocking'])->group(function () {
Route::resource('ipwhitelisting', '\WebToppings\IPWhitelisting\IPWhitelistingController');
});
Restricting Access
IPBlocking middleware to route groups (e.g., admin, API endpoints).Route::middleware(['throttle:60', 'IPBlocking'])->prefix('api/v1')->group(...);
Dynamic Whitelisting
IPWhitelist model (\WebToppings\IPWhitelisting\Models\IPWhitelist) to add logic (e.g., auto-whitelist trusted subnets):
use WebToppings\IPWhitelisting\Models\IPWhitelist;
IPWhitelist::create(['ip_address' => '192.168.1.0/24']);
api middleware group for granular control:
Route::middleware(['auth:api', 'IPBlocking'])->get('/admin-data', ...);
$this->app->instance(\WebToppings\IPWhitelisting\Middlewares\IPBlocking::class, function () {
return new class {
public function handle($request, Closure $next) { return $next($request); }
};
});
10.0.0.0/8) for bulk whitelisting.Middleware Order Matters
IPBlocking before auth if you want to block unauthenticated users by IP first:
Route::middleware(['IPBlocking', 'auth'])->group(...); // Blocks IP first
IPv6 Support
IPWhitelist model’s validateIp() method or use a regex like:
if (!filter_var($ip, FILTER_VALIDATE_IP, FILTER_FLAG_IPV6)) { ... }
Caching Headaches
IPBlocking with cached routes (e.g., php artisan route:cache), clear the cache after adding/removing IPs:
php artisan route:clear
False Positives
php artisan tinker
>>> \WebToppings\IPWhitelisting\Models\IPWhitelist::all();
use Illuminate\Support\Facades\Log;
public function handle($request, Closure $next) {
if (!$this->isWhitelisted($request)) {
Log::warning("Blocked IP: {$request->ip()}");
abort(403);
}
return $next($request);
}
Custom Block Page Override the 403 template by publishing views:
php artisan vendor:publish --tag=ipwhitelisting-views
Then modify resources/views/vendor/ipwhitelisting/403.blade.php.
Dynamic Whitelisting via API Create an API endpoint to add IPs programmatically:
Route::post('/whitelist-ip', function (Request $request) {
$validated = $request->validate(['ip' => 'required|ip']);
\WebToppings\IPWhitelisting\Models\IPWhitelist::create($validated);
return response()->json(['success' => true]);
});
IP Range Validation Add a custom validator for CIDR ranges:
use WebToppings\IPWhitelisting\Rules\ValidCidr;
$request->validate(['ip' => ['required', new ValidCidr]]);
How can I help you explore Laravel packages today?