前回書いたマルチ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]
);
}
}
パスワード変更のデモ
メールアドレス入力画面
メール送信完了
メールの画面
パスワード変更画面
パスワード変更完了後、ログインしてhome画面に遷移する。
上記の対応でusersテーブル以外でパスワードリセットが出来る様になりました!