ダークエリア

SEのお仕事の備忘録や、ゲームの話などなどを記事に放り込む!!

Laravelを搭載したサーバで、ApacheにBasic認証を書くのは古い方法だった…?

Apacheって、

.htaccessにも/etc/httpd/conf.d/***.confにも、Basic認証の設定を書くと

もれなく適用されるのですが

 

そこに、【特定のページにはBasic認証をしない】という設定をしたくて

「/」には認証あり、[/test/~」には認証なし、としたかった。

 

ググったらSetEnvIfとかrequireとかまぁ

「これ設定すりゃできるんだろうな~^^」

ってカンジの内容が出てくる出てくる。さっそく実現すべく設定。

 

しかしそのすべてを試しても、うんともすんともならないのであった

■原因

どういうことか?

 

・なぜか逆の事はできる(/は認証なし、/test~は認証あり)

・じゃあnotとか付けて逆の逆にしよう、もできない(なぜかすべてに認証がつく)

・なんかたまに認証が何回も聞かれることがある

 

原因はルーティングにあった。

Laravelはルーティングをしていて、実際にアクセスしているのはindex.php

たぶん必ず認証が設定されたところを通るような仕組みになってしまう。

 

■解決方法

なんとLaravelくん、ミドルウェアBasic認証ができるんだって!!

(ルーティングの穴を見越して用意された機能かも…)

Laravelで簡易的にBasic認証 - Qiita

ここを参考に設定。

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は相容れないということがわかった。。