Laravel5.8でマルチ認証を実装する(参考記事の補足)
Laravel5.8でのマルチ認証の大枠の実装に関してはこちらの記事を参考にしました。
しかし、記事にもいくつか修正すべき点が見受けられたので、忘備録も兼ねてまとめます。
【補足1】ルーティングはどのように記述すればいいの?
記事の方ではこのように書かれています。
routes/web.php
/** 以下追加 **/
// Admin
Route::group(['prefix' => 'admin'], function(){
// AdminHome
Route::get('home', 'Admin\HomeController@index')->name('admin.home');
//login&logout
Route::get('login', 'Admin\LoginController@showLoginForm')->name('admin.login');
Route::post('login', 'Admin\LoginController@login')->name('admin.login');
Route::post('logout', 'Admin\LoginController@logout')->name('admin.logout');
});
/** ここまで **/
Route::group(['prefix' => 'admin']としているだけで、肝心のmiddlewareに関する部分が抜けています。
なので、下記のように修正が必要です。
routes/web.php
// 'middleware'=>'auth:admin'を追加
Route::group(['prefix' => 'admin', 'middleware'=>'auth:admin'], function(){
//管理者ログインしたユーザーのみアクセス可能にしたいルーティングを記述
Route::get('home', 'Admin\HomeController@index')->name('admin.home');
});
//ログインやログアウト後のページに関しては、非ログイン時にアクセスするので'middleware'=>'auth:admin'の外に記述する
Route::get('admin/login', 'Admin\LoginController@showLoginForm')->name('admin_login');
Route::post('admin/login', 'Admin\LoginController@login')->name('admin_login');
Route::post('admin/logout', 'Admin\LoginController@logout')->name('admin_logout');
要点は以下2点。
・ログイン後のみアクセス許可したいページは'middleware'=>'auth:admin'をgroupで囲む
・ログインやログアウト後のページに関しては、非ログイン時にアクセスするので'middleware'=>'auth:admin'の外に記述する
【補足2】 管理者ログイン情報取得 正しくは、、、
管理者マイページにログイン中の管理者情報を取得する場合、記事だと以下のように書かれています。
xxxController.php
use Illuminate\Support\Facades\Auth;
$admin = Auth::user();
$admin->id;
$admin->name;
しかしこれだと、当然、通常ログイン中のユーザー情報が取得されてしまいます。そこで下記のように修正が必要になります。
xxxController.php
use Illuminate\Support\Facades\Auth;
$admin = Auth::guard('admin')->user(); //ログイン中の管理者情報を取得
$admin->id;
$admin->name;
guardとは何なのかについてはこちらの記事で解説されています。
要は、config/auth.phpで
config/auth.php
'guards' => [
'user' => [
'driver' => 'session',
'provider' => 'users',
],
'admin' => [
'driver' => 'session',
'provider' => 'admins',
],
],
と、adminをguardsに設定しているので、guard('admin')が使えるという事です。
より実践的な説明として、参考に例を挙げます。
管理者マイページにログイン中の管理者情報を表示したい場合、以下の通りになります。
ProfileController.php
namespace App\Http\Controllers\Admin; //必要。念の為これも補足。
use Illuminate\Support\Facades\Auth;
public function mypage()
{
$admin = Auth::guard('admin')->user();
return view('admin.profile.mypage',['admin' => $admin]);
}
こんな具合になります。そして、mypage.blade.phpで{{ $admin->name }}とすればnameが取得できます。
↧