icon
Let's create! WordPressサイト制作とメンテ/エラー対応から、PHP/CSS/javascriptプログラミング、動画・音・イラスト等制作まで扱うコラム

【Laravel・ミドルウェア】データベース操作が発生するページに、シンプルなBasic認証をつけてみた

更新: 2024/10/09 3073文字

今回は、フレームワークLaravelを使って、以前作ったページに簡易的な認証機能をつけてみたいと思います。Laravelに認証機能を付けられるパッケージはいくつかあるんですけど、今回はコマンドでBasic認証用のミドルウェアを追加してルーティング設定、というシンプルなものになっています。さっそく内容を確認していきましょう。

以前作ったページ(ここに認証をつけたい)

以前ローカル環境で作った『http://localhost/laravel/public/dbtest01/(他にadd,edit,delがある)』のページですが、ここはデータベースの操作が含まれています。今の段階だとこのページにだれでも入れるような状況になっているので、認証をつけようと思った次第です。

参考リンク(内部ヘルパ関数・ミドルウェア・PHP)

というわけで、シンプルなBasic認証をつけるにあたって調査し、以下のサイトを参考に行いました。内容的にはミドルウェア・abortで401出す(Unauthorized/未認証)・phpでheader情報出力というような点です。こちらも見ていただくと良いです。

下準備~artisan makeコマンドで認証用のミドルウェアを生成する

まずは、以下のようなartisan makeコマンドを使って、認証用のミドルウェアを生成します。ファイルの名前は『BasicAuthMw』とでもしましょうか。
(cd /xampp/htdocs/laravel/は、管理人のローカル環境でlaravel入れてるディレクトリを指定しています)

cd /xampp/htdocs/laravel/
php artisan make:middleware BasicAuthMw

『created successfully』がでたので、okです。

インストールディレクトリ/app/Http/Middleware/内に、『BasicAuthMw.php』が生成されました。手作業で作ってもいいんですけど、コマンドがあるやつはコマンドのほうが早いですね。

ミドルウェア編集・Kernelに登録・ルーティング設定

ミドルウェアBasicAuthMw.phpでユーザー名&パス指定と401表示

長いんでgithub gistにのせます。生成したファイルを上記のように編集しました。$request(フォーム入力)内の$username・$passwordが、スクリプト内の$admin_user&$admin_passと一致するかの判定をし、abortで401出す(Unauthorized/未認証)、headerでContent-TypeやWWW-Authenticate指定という流れ。

developer.mozilla.orgで確認したんですけど、『401 Unauthorizedレスポンスには、1 つ以上の WWW-Authenticateレスポンスヘッダーが含まれる必要がある』とのことです。

また、見ての通りスクリプト内にいちユーザーの情報がのっているだけなので、『不特定多数が認証を利用するようなアプリでは利用不可』『セキュリティ面はそんなに強くない』という感じです。担当者・担当部署が固定されている、限られた状況で利用する感じになるでしょうか。

app/Http/Kernel.phpにミドルウェア登録

次に、先ほど作ったミドルウェアをKernel.phpに登録します。『basicauthDBtest』という名前で登録しました。この名前で、Middleware/BasicAuthMwを呼べます。以下のコードをKernel.phpに追加。

protected $routeMiddleware = [
 'basicauthDBtest' => \App\Http\Middleware\BasicAuthMw::class,
];

画像でみると・・・ こんな感じになります。

認証かけたいページをグループにして(Route::group)ルーティング設定(/routes/web.php)

laravelには『Routeファサードのgroupメソッド』というのがあります。今回みたいに『特定のページをグループ化して、認証のミドルウェア使いたい』という場合も使えます。ルーティングにRoute::groupを追加。

Route::group([‘middleware’ => ‘basicauthDBtest’], function() { ~Route::get〇〇のように記載~ });

画像で見ると・・ こんな感じです。以前作った『dbtest01』ディレクトリ内をRoute::groupでまとめたようなイメージです。

表示例

それでは、認証をつけたページにアクセスしてみます。 このような感じで、basic認証のフォームが表示されました。

キャンセルした場合・・・ laravelの内部メソッドが『401(未認証)ですよー』というメッセージを出してくれます。

また、Basic認証には基本ログアウト機能がないため、『ブラウザを閉じる・履歴を消去・ホスト名に任意の文字と@つけてアクセス』などがありますが、任意の文字と@つけてログアウトリンクを作っても、新しいタブでアクセスしてやらないと入れないので、ややめんどくさいところがあります。

あとがき・まとめ

  • Laravelはミドルウェア作成&登録、ルーティング設定で、シンプルなBasic認証をつけることができる
  • 不特定多数がログインする環境では使えず、ログアウトもやや面倒

まとめると、こんなところでしょうか。小規模・限られた環境では使えなくはないんですが、今後『不特定多数のユーザーが利用する』というタイプのサイトも考えているので、他の認証パッケージも調査しています。


【カテゴリ】- Laravel
【タグ】-

関連記事