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

【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(文字列)・ユーザー名
email string(文字列)・ユーザーメルアド・ユニークな値
password string(文字列)・パスワード・ハッシュした値が入る
disp_name string(文字列)・表示名にする予定だったが使わなかった
role string(文字列)・ロール・管理者/編集者/読者みたいな権限
created_at timestamp・登録した日時がわかるように

マイグレーション&データベースにユーザー登録

コマンドでマイグレーションのファイルを作る

まずは、コマンドでマイグレーション用のファイルを作ります。『cd /xampp/htdocs/laravel』というのは、管理人のローカル環境でLaravelが入っているディレクトリです。テーブルの名前は『t_lar_admin_user』としましょうか。コマンドは以下の通りです。

cd /xampp/htdocs/laravel
php artisan make:migration create_t_lar_admin_user_table

『created successfully』と出ました。『database/migrations』内に、t_lar_admin_userのマイグレーションファイルが出来ています。このファイル内に設定を書いてマイグレーション実行します。

マイグレーション用ファイルにデータベースの内容を記載し、マイグレーションの実行

生成したマイグレーション用ファイルは、メソッド内がまっさらなんですけど、上記のデータベース内容に合わせて記載しました。基本的にはpublic function upの中にデータベースに入れたい内容を書いていきます。手打ちで作ってもいいんですけど、基本的にはコマンドのほうが速いですねー。

次は『マイグレーションの実行』です。以下のコマンド実行。

php artisan migrate

『DONE』が出たので、完了したようです。データベースを見に行ってみると・・・

こんな感じで、定義した内容が反映されていました。まだ実際のデータは入っていません。

tinkerを使って、ユーザー情報&ハッシュ化したパスワードを登録

前回の記事で行っていた内容なので詳しい説明は省きますが、『だれでも登録できるアプリケーションではない・パスワードはハッシュかけて入れたい』ということで、tinkerを使ってユーザーを登録しました。以下の過去記事もご覧ください。

コントローラー・ミドルウェア・ルーティング・ビューのファイルを用意する(詳細エディットはまだ)

コントローラー(いろんな内部処理につかう)をmake:controllerコマンドで生成

ビューを返したり、パスワード比較したりする(予定)の、コントローラーを準備します。これもコマンドで行います。名前は『larAdminController』としましょうか。以下のコマンド実行すると・・

php artisan make:controller larAdminController

『created successfully』となったので、該当フォルダを見てみます。

『app/Http/Controllers』内に、larAdminController.phpができました。

ミドルウェア(非ログイン者をハネるのに使う)をコマンドで生成

次はミドルウェアを用意します。調べたところ一般的には、コントローラー処理前後になんか処理を挟むときに使われるようです。結論から言うと『非ログイン者をハネる』という機能に使いました。名前は『larAdminLoginMiddleware』とします。以下のコマンドで生成。

php artisan make:middleware 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)
protected $routeMiddleware = [
 'larAdminLoginMW' =>\App\Http\Middleware\larAdminLoginMiddleware::class,
];

この『larAdminLoginMW』という名前は別名で、『ルーティングのときにこの名前で呼び出す』みたいに使われます。

ルーティングでフォームはpostメソッド指定したり、middlewareを指定したりする

(*ほかに良いやりかたがあるかもしれませんが)上記のようなルーティングのファイルを作って、routes/web.phpでロードするようにしました。通常getメソッドで、loginメソッド使うときはフォーム入力があるのでpostメソッド指定します。

また、indexViewのときは(ここはログイン後のページと考えているので)middlewareを呼んでログインしてない場合はハネるという流れになります。

表示例

ローカルで作ったので、ネット上で表示確認ができなくて恐縮ですが、こんな感じのページができました。まずログインページ。

間違ったパスワード入れたとき。前にフォーム入力した内容を表示させるのわすれていました(笑)({{old('ユーザー名l')}}みたいに書いて対応することができます)

ログイン後のページ。ユーザーがログイン状態じゃないときはloginにリダイレクトされるので入れません。ユーザー名とかも目立たないですが反映しました。

そしてログアウトすると、このページに。簡単ですがこんな感じです。

あとがき・まとめ

  • Laravelには認証パッケージやライブラリが多くあるが、自作もできる
  • 自作する場合はデータベースにユーザー登録・コントローラーやビュー・ルーティング・ミドルウェアを準備する

まとめると、こんなところでしょうか。コードはとりあえず簡単なログイン・ログアウトができるような形で、特に洗練されていないので、今後ブラッシュアップしていきます。


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

関連記事