環境
- laravel 5.5 on laradock
ミドルウェアでIP制限
ミドルウェアつくる
php artisan make:middleware IpRestriction
app/Http/Middleware/IpRestriction.php をよしなに書く
<?php
namespace App\Http\Middleware;
use Closure;
class IpRestriction
{
public function handle($request, Closure $next)
{
// 許すIP
// configに書いてあったりDBから取ってきたり
$ips = collect(['11.23.58.13']);
// 許すIPリストに含まれなければリダイレクト
if (!$ips->contains($request->ip()) {
return redirect('/');
}
return $next($request);
}
}
app/Http/Kernel.php でミドルウェアに名前をつける
<?php
// ...
protected $routeMiddleware = [
// ...
'ip_restriction' => \App\Http\Middleware\IpRestriction::class,
];
routes/web.php でよしなに使う
<?php
Route::middleware('ip_restriction')->get('/hoge', function () {/*...*/});
IPをモックしてテスト(本題)
-
以下を自動テストしたくなる
- 許可したIPでアクセスできる
- 許可しないIPでアクセスするとリダイレクトされる
How to mock the clients Ip address
bash
php artisan make:test IpTest
tests/Feature/IpTest.php
<?php
/**
* @test
*/
public function 許可したIPでアクセスできる() {
$response = $this->call(
'GET',
'/hoge' // IP制限のあるルート
[],
[],
[],
['REMOTE_ADDR' => '11.23.58.13'] // 許可するIP
);
$response->assertStatus(200);
}
/**
* @test
*/
public function 許可しないIPでアクセスするとリダイレクトされる() {
$response = $this->call(
'GET',
'/hoge' // IP制限のあるルート
[],
[],
[],
['REMOTE_ADDR' => '127.0.0.1'] // 許可しないIP
);
$response->assertRedirect();
}
思い出したままに書いてるから動作未検証
大筋は合ってるはず