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


関連記事

Go言語

Go言語 gocraft/workを使って常駐プロセスでジョブを処理させる

1 はじめに2 workの特徴3 workを使えるようにする3.1 Redisのインストール3.2 Go用のライブラリインストール4 Enqueue〜ジョブ実行まで4.1 Enqueue側4.2 ジョ ...

laravel logo

Laravelのコントローラの基礎

1 はじめに2 ルーティング2.1 使用可能なメソッド2.2 リダイレクト2.3 Viewの返却2.4 ルートパラメータ2.5 ミドルウェア2.6 プレフィックス3 バリデーション3.1 コントローラ ...

Go言語

goroutineとchannelとContext

1 はじめに2 並行処理と並列処理3 goroutine4 channel4.1 channelからデータ受信4.2 for-range でのデータ受信4.3 複数のchannelを受信4.4 buf ...

rails

さらば「rails migrate」、よろしく「ridgepole」

1 はじめに2 Ridgepoleとは3 rails migrateではなく、Ridgepoleを選定した理由4 rails migrateからRidgepoleへの移行手順5 capistrano3 ...

laravel logo

【Laravel】認証を自作して学ぶguardとmiddleware

1 はじめに1.1 認証処理の仕様2 独自の認証処理の実装2.1 Modelの実装2.2 UserProviderの実装2.3 Guardの実装2.4 Middlewareの実装2.5 Handler ...

フォロー

follow us in feedly

blog-page_side_responsive

2018年12月
 1
2345678
9101112131415
16171819202122
23242526272829
3031 

アプリ情報

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