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


関連記事

laravel logo

Laradock環境にPHPStormからXdebugする

1 はじめに2 Laradock側の設定変更2.1 xdebug.iniファイル2.2 .env2.3 コンテナの再構築3 PHPStormの設定3.1 Preferences3.1.1 Build, ...

laravel logo

Laravelの基礎知識

1 はじめに2 Laravelの概要2.1 学習コストが低い2.2 Symfonyがベース2.3 DIを積極的に活用している3 ディレクトリ構成3.1 app3.2 bootstrap3.3 conf ...

laravel logo

[Laravel]データベースの暗号化について考えてみる

1 はじめに2 環境3 Laravelでの暗号化4 暗号化されたカラムは、そのままではLIKE検索ができない4.1 問題点4.2 解決案1:全件取得してPHP側でがんばって検索する4.3 解決案2:暗 ...

rails

Railsのバリデーション

1 はじめに2 基本的なバリデーション3 EachValidatorクラス4 Validatorクラス5 autoload_pathsの編集6 さいごに はじめに 今回はRailsのActiveRec ...

rails

ShrineでS3に画像をアップロードする

1 はじめに1.1 前提条件1.2 関連記事2 AWS側の準備2.1 S3バケットを作成する2.2 CORSを設定する2.3 アクセス用のユーザを作成する3 Rails側の設定3.1 Initiali ...

フォロー

follow us in feedly

blog-page_side_responsive

2018年12月
 1
2345678
9101112131415
16171819202122
23242526272829
3031 

アプリ情報

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