LoginSignup
5
3

More than 5 years have passed since last update.

マルチAuth実装としてusersテーブル以外のパスワード情報を変更する

Posted at

前回書いたマルチAuthの記事の続きです。
マルチAuthの実装によって別のテーブルに登録されているパスワード情報を変更する方法をまとめます。

*auth.phpにてガードの設定が記述されていることが前提です。

動作環境について

OS:macOS High Sierra
version: 10.13.6

Docker(Engine):18.09.0

対象ブラウザ

GoogleChrome:71以上

環境

centOS:7.5
Laravel:5.6
PHP:7.2
MySQL:5.7
APache2.4

参考資料

Laravel5.5のメール送信をMailgun API(無料)で行う~アカウント開設、DNS設定からMailableクラスでの送信まで~
Laravel5.7: 日本語のパスワードリセット用のメールを送信する
Laravel 5.6 パスワードリセット カスタマイズ

メール送信について

メール送信については私はMailgunを利用しました。
参考の記事を元に、下記の手順でMail送信が出来る様になりました。
1.「お名前.com」でドメインの購入
2.Mailgunでドメインの登録
3.「お名前.com」でDNSレコード設定

ルーティングの設定

前回書いた記事を元にweb.phpを編集します。

Route::group(['prefix' => 'admin'], function(){


    // ・・・省略・・・

    // Password Reset Routes...
    Route::get('password/reset', 'Admin\Auth\ForgotPasswordController@showLinkRequestForm')->name('admin_password_request');
    Route::post('password/email', 'Admin\Auth\ForgotPasswordController@sendResetLinkEmail')->name('admin_password_email');
    Route::get('password/reset/{token}', 'Admin\Auth\ResetPasswordController@showResetForm')->name('admin_password_reset');
    Route::post('password/reset', 'Admin\Auth\ResetPasswordController@reset')->name('admin_password_reset_post');

    Route::get('home', 'Admin\HomeController@index')->name('admin_home');
});

Notificationの作成

通知クラスの作成を行います。

[root@87c2be02241a shop]# php artisan make:notification OriginalPasswordReset
Notification created successfully.

「/app/Notifications/OriginalPasswordReset.php」が作成されます。

「OriginalPasswordReset.php」を編集します。

「ResetPassword」の宣言とコンストラクタにトークンを追記します。

use Illuminate\Auth\Notifications\ResetPassword;
/**
 * Create a new notification instance.
 *
 * @param string $token
 * @return void
 */
public function __construct($token)
{
    $this->token = $token;
}

toMailメソッドを下記の通りに編集します。
url()メソッド内のパラメーターはメールに記載されるリンクのURLになります。

/**
 * Get the mail representation of the notification.
 *
 * @param  mixed  $notifiable
 * @return \Illuminate\Notifications\Messages\MailMessage
 */
public function toMail($notifiable)
{
    return (new MailMessage)
                ->subject(__('Reset Password'))
                ->view('emails.password_reset')
                ->action(__('Reset Password'), url('admin/password/reset', $this->token));
}

メールのテンプレートは上記に指定した通りに「/resources/views/emails/password_reset.blade.php」に記載された内容が反映される為、参考通りに編集します。

Modelの設定

前回の記事にて作成したAdmin.phpを編集します。

宣言を追加します。

use App\Notifications\OriginalPasswordReset;
use Illuminate\Support\Facades\Password;

ブローカーの取得処理と通知の送信処理を追記します。

/**
 *パスワードリセットに使われるブローカの取得
*
* @return PasswordBroker
*/
protected function broker()
{
    return Password::broker('admin');
}

/**
 * パスワードリセット通知の送信
 *
 * @param  string  $token
 * @return void
 */
public function sendPasswordResetNotification($token)
{
    $this->notify(new OriginalPasswordReset($token));
}

Viewの設定

デフォルトのAuthファイルをコピペして作成された、下記のファイルを編集します
「/resources/views/admin/passwords/email.blade.php」
「/resources/views/admin/passwords/reset.blade.php」

viewファイルはフォームアクションのrouteのnameを変更しているだけです。

email.blade.php

-action="{{ route('password.email') }}"
+action="{{ route('admin_password_email') }}"

reset.blade.php

-action="{{ route('password.request') }}"
+action="{{ route('admin_password_reset_post') }}"

継承元も変更します。

対象:
email.blade.php
reset.blade.php

-@extends('layouts.app')
+@extends('layouts.admin')

Controllerの設定

「ForgotPasswordController.php」、「ResetPasswordController.php」を編集します。
コンストラクタで「guest:admin」を指定し、guardメソッドで「admin」を指定する必要があります。
また、ブローカー取得処理にて「admin」を指定する必要があります。

「/app/Http/Controllers/Admin/Auth/ForgotPasswordController.php」
下記の宣言が必要です。

use Illuminate\Support\Facades\Password;
<?php

namespace App\Http\Controllers\Admin\Auth;

use App\Http\Controllers\Controller;
use Illuminate\Foundation\Auth\SendsPasswordResetEmails;
use Illuminate\Support\Facades\Password;

class ForgotPasswordController extends Controller
{
    /*
    |--------------------------------------------------------------------------
    | Password Reset Controller
    |--------------------------------------------------------------------------
    |
    | This controller is responsible for handling password reset emails and
    | includes a trait which assists in sending these notifications from
    | your application to your users. Feel free to explore this trait.
    |
    */

    use SendsPasswordResetEmails;

    /**
     * Create a new controller instance.
     *
     * @return void
     */
    public function __construct()
    {
        $this->middleware('guest:admin');
    }

    public function guard()
    {
        return Auth::guard('admin');
    }

    /**
     * Display the form to request a password reset link.
     *
     * @return \Illuminate\Http\Response
     */
    public function showLinkRequestForm()
    {
        return view('admin.passwords.email');
    }

    /**
     *パスワードリセットに使われるブローカの取得
    *
    * @return PasswordBroker
    */
    protected function broker()
    {
        return Password::broker('admin');
    }

}

「/app/Http/Controllers/Admin/Auth/ResetPasswordController.php」
下記の3つの宣言が必要です。

use Illuminate\Support\Facades\Password;
use Illuminate\Support\Facades\Auth;
use Illuminate\Http\Request;

パスワードリセット後のリダイレクト先を「/admin/home」に指定します。
パスワード変更メールのリンクを叩いた時に適切なviewが表示される様にshowResetForm()をこのファイル内で記述してviewファイルを指定する必要があります。

<?php

namespace App\Http\Controllers\Admin\Auth;

use App\Http\Controllers\Controller;
use Illuminate\Foundation\Auth\ResetsPasswords;
use Illuminate\Support\Facades\Password;
use Illuminate\Support\Facades\Auth;
use Illuminate\Http\Request;

class ResetPasswordController extends Controller
{
    /*
    |--------------------------------------------------------------------------
    | Password Reset Controller
    |--------------------------------------------------------------------------
    |
    | This controller is responsible for handling password reset requests
    | and uses a simple trait to include this behavior. You're free to
    | explore this trait and override any methods you wish to tweak.
    |
    */

    use ResetsPasswords;

    /**
     * Where to redirect users after resetting their password.
     *
     * @var string
     */
    protected $redirectTo = '/admin/home';

    /**
     * Create a new controller instance.
     *
     * @return void
     */
    public function __construct()
    {
        $this->middleware('guest:admin');
    }

    public function guard()
    {
        return Auth::guard('admin');
    }

    /**
     *パスワードリセットに使われるブローカの取得
    *
    * @return PasswordBroker
    */
    protected function broker()
    {
        return Password::broker('admin');
    }

    /**
     * Show the application dashboard.
     *
     * @return \Illuminate\Http\Response
     */
    public function showResetForm(Request $request, $token = null)
    {
        return view('admin.passwords.reset')->with(
            ['token' => $token, 'email' => $request->email]
        );
    }
}

パスワード変更のデモ

メールアドレス入力画面

スクリーンショット 2018-12-16 14.57.31.png

メール送信完了

スクリーンショット 2018-12-16 14.57.58.png

メールの画面

スクリーンショット 2018-12-16 15.02.35.png

パスワード変更画面

スクリーンショット 2018-12-16 15.03.38.png

パスワード変更完了後、ログインしてhome画面に遷移する。

スクリーンショット 2018-12-16 15.03.55.png

上記の対応でusersテーブル以外でパスワードリセットが出来る様になりました!

5
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
3