【Laravel】ログイン機能自作してみた(ミドルウェアで非ログインをハネる・マイグレーション・コントローラ&ビューなど一部始終)
| 更新: 2024/10/28 | 4610文字

今回はLaravelのログイン機能を自作してみたので、その一部始終を紹介します。breezeやJetstreamとか、外部パッケージとか多くて、管理人はわけわからなくなってましたが、なんとかなりました。ほぼ自分用のメモみたいな感じですが、よかったら見てやってください。それでは早速内容を確認していきましょう。
目次
今回のLaravel自作ログインシステムの設計
ページ構成や機能
とりあえず、自作ログインテストって感じなので、シンプルに以下のように考えました。public/lar-admin/〇〇のようなアドレスになります。なお、登録ページは無しです(ユーザーはtinkerコマンドで登録します)。
lar-admin/index | ログイン者向けのページ・管理画面風・非ログイン者はリダイレクト・ユーザー名表示 |
---|---|
lar-admin/login | ログインページ・メルアド&パスワードのフォーム・エラー時はその旨を表示 |
lar-admin/logout | ログアウトページ・セッションの破棄 |
ユーザー情報データベース設計(マイグレーション)
データベースに登録するユーザーの内容は、以下のように考えました。実際、ログインに使うのは『email・password』の二つです。nameはログイン後の名前表示に。disp_nameは作ったものの、今回は使いませんでした。マイグレーションするときに、スクリプトにこれらの項目を入れます。
id | bigIncrements(符号なしBIGINT自動増分)・ユーザーid |
---|---|
name | string(文字列)・ユーザー名 |
string(文字列)・ユーザーメルアド・ユニークな値 | |
password | string(文字列)・パスワード・ハッシュした値が入る |
disp_name | string(文字列)・表示名にする予定だったが使わなかった |
role | string(文字列)・ロール・管理者/編集者/読者みたいな権限 |
created_at | timestamp・登録した日時がわかるように |
マイグレーション&データベースにユーザー登録
コマンドでマイグレーションのファイルを作る
まずは、コマンドでマイグレーション用のファイルを作ります。『cd /xampp/htdocs/laravel』というのは、管理人のローカル環境でLaravelが入っているディレクトリです。テーブルの名前は『t_lar_admin_user』としましょうか。コマンドは以下の通りです。
php artisan make:migration create_t_lar_admin_user_table
『created successfully』と出ました。『database/migrations』内に、t_lar_admin_userのマイグレーションファイルが出来ています。このファイル内に設定を書いてマイグレーション実行します。
マイグレーション用ファイルにデータベースの内容を記載し、マイグレーションの実行
生成したマイグレーション用ファイルは、メソッド内がまっさらなんですけど、上記のデータベース内容に合わせて記載しました。基本的にはpublic function upの中にデータベースに入れたい内容を書いていきます。手打ちで作ってもいいんですけど、基本的にはコマンドのほうが速いですねー。
次は『マイグレーションの実行』です。以下のコマンド実行。
『DONE』が出たので、完了したようです。データベースを見に行ってみると・・・
こんな感じで、定義した内容が反映されていました。まだ実際のデータは入っていません。
tinkerを使って、ユーザー情報&ハッシュ化したパスワードを登録
前回の記事で行っていた内容なので詳しい説明は省きますが、『だれでも登録できるアプリケーションではない・パスワードはハッシュかけて入れたい』ということで、tinkerを使ってユーザーを登録しました。以下の過去記事もご覧ください。
(過去記事)【Laravel】tinkerでデータベースを操作し、パスワードにハッシュ化した値を入れる
https://division-web.atelier-ss-agency.com/10637/laravel-tinker-db-insert-hashed-password/
コントローラー・ミドルウェア・ルーティング・ビューのファイルを用意する(詳細エディットはまだ)
コントローラー(いろんな内部処理につかう)をmake:controllerコマンドで生成
ビューを返したり、パスワード比較したりする(予定)の、コントローラーを準備します。これもコマンドで行います。名前は『larAdminController』としましょうか。以下のコマンド実行すると・・
『created successfully』となったので、該当フォルダを見てみます。
『app/Http/Controllers』内に、larAdminController.phpができました。
ミドルウェア(非ログイン者をハネるのに使う)をコマンドで生成
次はミドルウェアを用意します。調べたところ一般的には、コントローラー処理前後になんか処理を挟むときに使われるようです。結論から言うと『非ログイン者をハネる』という機能に使いました。名前は『larAdminLoginMiddleware』とします。以下のコマンドで生成。
コマンドokなようです。該当のフォルダを見てみます。
『app/Http/Middleware』内に、larAdminLoginMiddlewareが生成されました。なお、basic認証つけたときもやったんですけど、このミドルウェアはKernel.phpに後で登録します。
ビューファイル(login・logout・ログイン後ページ)を用意しておく
ビューファイルについてですが、login・logout・ログイン後ページの3つを、まず静的htmlで用意しておきました。こんな感じで。
これらのファイルを、resources/views/lar-admin(今回のアプリケーション用に用意したフォルダ)に置いておきます。この段階ではまだ、変数やblade用ディレクティブセットしたりはしていません。
Laravelログイン機能自作・コード例
コントローラー部分
まず、Facades\DB・Facades\Hashを追加しています。DBはデータベースのユーザーデータ参照用・Hashはハッシュ化パスワード比較のためです。通常はそのままloginページを返しますが、Hash::checkでパスワード一致しない場合やユーザーが見つからない場合、$login_errorがセットされるようになっています。
indexViewは単純にログイン後ページを表示するだけですが、Laravelのsessionメソッドからユーザー名を取ってきてビューに渡す用にしました。logoutの表示時には、sessionメソッドでログイン中のセッションを空にします。
ミドルウェア&app/Http/Kernel.phpへの登録
ミドルウェア内には、『ログイン必須ページでsessionが無い場合、ログインフォームに戻される』というような処理を追加しました。実際に適応させるためにはapp/Http/Kernel.phpに登録するのが必要なので、Kernel.php内の$routeMiddlewareに『larAdminLoginMW』という名前で、以下のように書いて登録。
(*app/Http/Kernel.php)'larAdminLoginMW' =>\App\Http\Middleware\larAdminLoginMiddleware::class,
];
この『larAdminLoginMW』という名前は別名で、『ルーティングのときにこの名前で呼び出す』みたいに使われます。
ルーティングでフォームはpostメソッド指定したり、middlewareを指定したりする
(*ほかに良いやりかたがあるかもしれませんが)上記のようなルーティングのファイルを作って、routes/web.phpでロードするようにしました。通常getメソッドで、loginメソッド使うときはフォーム入力があるのでpostメソッド指定します。
また、indexViewのときは(ここはログイン後のページと考えているので)middlewareを呼んでログインしてない場合はハネるという流れになります。
表示例
ローカルで作ったので、ネット上で表示確認ができなくて恐縮ですが、こんな感じのページができました。まずログインページ。
間違ったパスワード入れたとき。前にフォーム入力した内容を表示させるのわすれていました(笑)({{old('ユーザー名l')}}みたいに書いて対応することができます)
ログイン後のページ。ユーザーがログイン状態じゃないときはloginにリダイレクトされるので入れません。ユーザー名とかも目立たないですが反映しました。
そしてログアウトすると、このページに。簡単ですがこんな感じです。
あとがき・まとめ
- Laravelには認証パッケージやライブラリが多くあるが、自作もできる
- 自作する場合はデータベースにユーザー登録・コントローラーやビュー・ルーティング・ミドルウェアを準備する
まとめると、こんなところでしょうか。コードはとりあえず簡単なログイン・ログアウトができるような形で、特に洗練されていないので、今後ブラッシュアップしていきます。
【カテゴリ】- Laravel
【タグ】-