【Laravel・ミドルウェア】データベース操作が発生するページに、シンプルなBasic認証をつけてみた
| 更新: 2024/10/09 | 3073文字
今回は、フレームワークLaravelを使って、以前作ったページに簡易的な認証機能をつけてみたいと思います。Laravelに認証機能を付けられるパッケージはいくつかあるんですけど、今回はコマンドでBasic認証用のミドルウェアを追加してルーティング設定、というシンプルなものになっています。さっそく内容を確認していきましょう。
目次
以前作ったページ(ここに認証をつけたい)
以前ローカル環境で作った『http://localhost/laravel/public/dbtest01/(他にadd,edit,delがある)』のページですが、ここはデータベースの操作が含まれています。今の段階だとこのページにだれでも入れるような状況になっているので、認証をつけようと思った次第です。
(過去記事)DBクラスを使って、SQLiteデータベースのCRUD操作をやってみる
https://division-web.atelier-ss-agency.com/10473/laravel-db-class-crud/
参考リンク(内部ヘルパ関数・ミドルウェア・PHP)
というわけで、シンプルなBasic認証をつけるにあたって調査し、以下のサイトを参考に行いました。内容的にはミドルウェア・abortで401出す(Unauthorized/未認証)・phpでheader情報出力というような点です。こちらも見ていただくと良いです。
Laravelで簡易的にBasic認証(quita.com)
https://qiita.com/nozaki-sankosc/items/dc666433d7b92137a48e
HTTP Exceptions(Laravel公式ドキュメント)
https://laravel.com/docs/11.x/errors#http-exceptions
PHP による HTTP 認証 (phpマニュアル)
https://www.php.net/manual/ja/features.http-auth.php
下準備~artisan makeコマンドで認証用のミドルウェアを生成する
まずは、以下のようなartisan makeコマンドを使って、認証用のミドルウェアを生成します。ファイルの名前は『BasicAuthMw』とでもしましょうか。
(cd /xampp/htdocs/laravel/は、管理人のローカル環境で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に追加。
'basicauthDBtest' => \App\Http\Middleware\BasicAuthMw::class,
];
画像でみると・・・ こんな感じになります。
認証かけたいページをグループにして(Route::group)ルーティング設定(/routes/web.php)
laravelには『Routeファサードのgroupメソッド』というのがあります。今回みたいに『特定のページをグループ化して、認証のミドルウェア使いたい』という場合も使えます。ルーティングにRoute::groupを追加。
画像で見ると・・ こんな感じです。以前作った『dbtest01』ディレクトリ内をRoute::groupでまとめたようなイメージです。
表示例
それでは、認証をつけたページにアクセスしてみます。 このような感じで、basic認証のフォームが表示されました。
キャンセルした場合・・・ laravelの内部メソッドが『401(未認証)ですよー』というメッセージを出してくれます。
また、Basic認証には基本ログアウト機能がないため、『ブラウザを閉じる・履歴を消去・ホスト名に任意の文字と@つけてアクセス』などがありますが、任意の文字と@つけてログアウトリンクを作っても、新しいタブでアクセスしてやらないと入れないので、ややめんどくさいところがあります。
あとがき・まとめ
- Laravelはミドルウェア作成&登録、ルーティング設定で、シンプルなBasic認証をつけることができる
- 不特定多数がログインする環境では使えず、ログアウトもやや面倒
まとめると、こんなところでしょうか。小規模・限られた環境では使えなくはないんですが、今後『不特定多数のユーザーが利用する』というタイプのサイトも考えているので、他の認証パッケージも調査しています。
【カテゴリ】- Laravel
【タグ】-