Laravelを搭載したサーバで、ApacheにBasic認証を書くのは古い方法だった…?
Apacheって、
.htaccessにも/etc/httpd/conf.d/***.confにも、Basic認証の設定を書くと
もれなく適用されるのですが
そこに、【特定のページにはBasic認証をしない】という設定をしたくて
「/」には認証あり、[/test/~」には認証なし、としたかった。
ググったらSetEnvIfとかrequireとかまぁ
「これ設定すりゃできるんだろうな~^^」
ってカンジの内容が出てくる出てくる。さっそく実現すべく設定。
しかしそのすべてを試しても、うんともすんともならないのであった
■原因
どういうことか?
・なぜか逆の事はできる(/は認証なし、/test~は認証あり)
・じゃあnotとか付けて逆の逆にしよう、もできない(なぜかすべてに認証がつく)
・なんかたまに認証が何回も聞かれることがある
原因はルーティングにあった。
Laravelはルーティングをしていて、実際にアクセスしているのはindex.php。
たぶん必ず認証が設定されたところを通るような仕組みになってしまう。
■解決方法
なんとLaravelくん、ミドルウェアでBasic認証ができるんだって!!
(ルーティングの穴を見越して用意された機能かも…)
ここを参考に設定。
php artisan make:middleware BasicAuthMiddleware
▼App\Http\Middleware\BasicAuthMiddleware.php
public function handle(Request $request, Closure $next)
{
$username = $request->getUser();
$password = $request->getPassword();
if ($username == 'sample' && $password == 'sample') {
return $next($request);
}
abort(401, "Enter username and password.", [
header('WWW-Authenticate: Basic realm="Sample Private Page"'),
header('Content-Type: text/plain; charset=utf-8')
]);
}
▼app/Http/Kernel.php
'basicauth' => \App\Http\Middleware\BasicAuthMiddleware::class,
▼各route.phpファイル
Route::group(['middleware' => 'basicauth'], function() {~~~で囲う。
以上。
また一つ賢くなった。認証に関する設定について、
ApacheとLaravelは相容れないということがわかった。。