BackEnd

Laravel Authのパスワードリセット機能をカスタマイズする

投稿日:

はじめに

こんにちは。Laravelには標準の認証機能Authが用意されており、その中にはパスワードリセット機能が最初から含まれています。 メールアドレスを入力するとメールが送信され、メール本文内のURLにアクセスしてパスワードを再設定できるという、様々なサイトにある機能です。

今回はこのパスワードリセット機能を一部カスタマイズすることで、Laravelの認証機能のカスタマイズ方法を追っていきたいと思います。

環境はmacOS High Sierra+Laradockで構築し、LaravelのバージョンはLTS版の最新である5.5を使用します。また、Docker本体のインストール完了、およびLaradockで環境構築しWelcomeページが表示できていることが前提となります。

準備

Auth

ログイン画面等のviewは、Laravel標準で提供されている auth を利用します。PHPが動作しているコンテナにログインし、 artisan コマンドを実行することで自動生成できます。

mailhog

mailhogは簡易SMTPサーバの一種で、mailhogに対してPHPやRubyなどからメール送信処理を実行することで、実際のアドレスに送信することなく、メールの内容を確認することができます。 mailhogのコンテナはLaradockに含まれており、build&upで簡単に立ち上げることができます。

立ち上げた後は localhost:8025 にアクセスすると、mailhogに送信したメールをブラウザから確認できます。なお、mailhogの設定はdocker-compose.ymlに記述されており、デフォルトでは下記のようになっています。 この場合、1025番ポートでメールを待ち受けており、8025番ポートでブラウザからのアクセスを待ち受けているという意味になります。

続いてLaravelのメール送信設定を変更します。Laravelプロジェクトのトップディレクトリにある .env を編集し、デフォルトから以下のように変更します。

これでLaravelから送信されるメールをmailhogでキャッチし、実際にメールアドレスに送信することなくメール内容を確認できるようになりました。

ユーザー登録とログイン

localhost/register にアクセスすると登録フォームが表示されます。 任意のアカウント名・メールアドレス・パスワードを入れて登録を行い、ログイン完了した旨が表示されたら、画面右上のリンクからログアウトしましょう。

パスワードリセットのカスタマイズ

http://localhost/login で「Forgot Your Password?」をクリックすると、メールアドレス入力画面が表示されます。 デフォルトではここで入力したメールアドレスにパスワードリセット用のURLが送信されますが、今回はアカウント名でリセットを行うようにカスタマイズしてみます。

ルーティング確認

「どのURLにアクセスしたらどのアクションメソッドが呼ばれるか」を確認するにはいくつか方法がありますが、ここでは artisan コマンドを使います。

メールアドレス入力画面のURLはpassword/resetですので、対応しているのは下記の行となります。

GET|HEAD | password/reset | password.request | App\Http\Controllers\Auth\ForgotPasswordController@showLinkRequestForm

ところが ForgotPasswordController を開いてみると showLinkRequestForm は存在せず、実際の処理は SendsPasswordResetEmails のshowLinkRequestFormで行われています。 これで auth/passwords/email.blade.php を呼び出しているのが分かりました。viewのファイル名を変えたり、viewを呼び出す以外の処理を行いたい場合は ForgotPasswordController クラスで showLinkRequestForm をオーバーライドすることでカスタマイズが可能です。

view編集

auth/passwords/email.blade.php を以下のように編集し、メールアドレスではなくアカウント名を入れるようにします。

認証処理の編集

viewの編集が完了したら、ユーザー登録したときのアカウント名を入力して「Send Password Reset Link」を…と言いたいところですが、本来はメールアドレスの入力を想定した機能ですので、アカウント名を入力しても動作せず、エラー扱いになってしまいます。認証部分の処理もカスタマイズしましょう。

auth/passwords/email.blade.php のform要素を見ると、送信先は password/email が指定されています。

先述の php artisan route:list で該当するのは以下の行です。

POST | password/email | password.email | App\Http\Controllers\Auth\ForgotPasswordController@sendResetLinkEmail

ここでも ForgotPasswordController に該当のメソッドは存在せず、実体は SendsPasswordResetEmails に実装されています。

今回はこれらのメソッドを ForgotPasswordController クラスの中でオーバーライドして、下記のように実装します。

ここまで完了したら http://localhost/password/reset でアカウント名を入力し「Send Password Reset Link」ボタンを押しましょう。 成功すれば「We have e-mailed your password reset link!」と表示されて、登録時に入力したメールアドレスにメールが送信…は実際には行われません。 localhost:8025 にアクセスすると、webメールサービスの受信画面のようなページが表示され、ここで送信内容が確認できます。

以下2つは前述の mailhog の一覧・詳細画面です。通常のSMTPサーバであればLaravelからメールアドレス宛に送信が行われますが、 mailhog がメールをキャッチし、外部への送信を行わずSMTPサーバ内に留めて、このように表示しています。

リセット画面

メールに表示されている「Reset Password」のリンクにアクセスすると、新しいパスワードを入力する画面が表示されます。ここでのルーティング情報は下記のとおりです。

GET|HEAD | password/reset/{token} | password.reset | App\Http\Controllers\Auth\ResetPasswordController@showResetForm

今までと同じく ResetPasswordControllershowResetForm メソッドは無く、実装は ResetsPasswords で行われています。

このメソッドをカスタマイズする際も、先ほどの sendResetLinkEmail と同パターンで、ここでは ResetPasswordController でオーバーライドすることになります。 実際のリセット処理や、リセット完了後のページ転送処理も ResetsPasswords に実装されており、それぞれカスタマイズが可能です。

さいごに

いかがでしたでしょうか。1機能の条件をひとつ変えるだけで随分面倒な…と感じるかもしれませんが、実装方法を細かく指定することはフレームワーク(枠組み)の意図するところであり、こうした学習コストと引き換えに、メソッドの命名や処理の遷移が実装者に左右されなくなるというメリットを得られるのだと思います。

おすすめ書籍

PHPフレームワーク Laravel Webアプリケーション開発 バージョン5.5 LTS対応 PHPフレームワーク Laravel入門 Laravelエキスパート養成読本[モダンな開発を実現するPHPフレームワーク!] (Software Design plus)

blog-page_footer_336




blog-page_footer_336




-BackEnd
-,

執筆者:

免責事項

このブログは、記事上部に記載のある投稿日時点の一般的な情報を提供するものであり、投資等の勧誘・法的・税務上の助言を提供するものではありません。仮想通貨の投資・損益計算は複雑であり、個々の取引状況や法律の変更によって異なる可能性があります。ブログに記載された情報は参考程度のものであり、特定の状況に基づいた行動の決定には専門家の助言を求めることをお勧めします。当ブログの情報に基づいた行動に関連して生じた損失やリスクについて、筆者は責任を負いかねます。最新の法律や税務情報を確認し、必要に応じて専門家に相談することをお勧めします。


comment

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

CAPTCHA


関連記事

Stripe Connectを使って複合プランの継続課金を実装

1 はじめに1.1 想定する継続課金1.2 想定するシチュエーション2 継続課金商品の作成2.1 プランの継続課金商品の作成2.2 ID数の継続課金商品の作成3 実装3.1 プランAとID数を30契約 ...

markdownで書けるドキュメントツールのGitbookを試す

1 はじめに2 Gitbookとは3 nvm4 node.jsインストール5 Gitbook導入5.1 インストール5.2 初期化5.3 ローカルでブラウザから確認6 作成と編集6.1 見出し編集7 ...

rails

Railsで複合主キーのテーブルを扱う

1 はじめに1.1 前提条件2 実装例2.1 config2.2 マイグレーション2.3 モデル3 さいごに はじめに RailsでWebサービスを開発する際のDB設計では基本的にidが主キーになると ...

Go言語

Goの抽象構文木でコードを解析する

1 はじめに1.1 抽象構文木とは2 ASTでコードを解析する2.1 サンプルコードを解析する2.2 構造体の木構造を確認する2.3 メソッドの木構造を確認する3 任意の対象を捜索する4 ASTをファ ...

Go言語

mutexを使ってGoで排他処理をする

1 はじめに1.1 mutexとは2 mutexを使った排他制御2.1 失敗するケース2.2 mutexを使って排他制御した場合2.3 構造体へmutexを埋め込む3 RWMutexを使う4 さいごに ...

フォロー

blog-page_side_responsive

2018年12月
 1
2345678
9101112131415
16171819202122
23242526272829
3031  

アプリ情報

私たちは無料アプリもリリースしています、ぜひご覧ください。 下記のアイコンから無料でダウンロードできます。