Laravelデフォルトの認証に加え、管理者用の認証機能を実装したいです。
ネットの記事を参考にして実装してみましたが、ガードの設定周りで躓いています。
前提
・Adminモデルとadminsテーブルが存在し、基本的にUserと同じ
・管理者はログインのみ (UIでの新規登録、パスワードリセット等は必要ない)
・Adminの新規登録は Tinker から行う
・管理者ページのURLは全て /admin 下にする
疑問点
(1) ガードに関する認識は以下で合ってますか?
ガードのデフォルトがwebなら、
・middleware('auth') は middleware('auth:web') と同義。
・Auth::check()は
(ミドルウェア保護が無いルートでは)Auth::guard('web')->check() と同義
(保護が有るルートでは)Auth::guard('保護ガード名')->check() と同義
(2)config\auth.phpの設定は、Adminの分をguardとproviderに追加するだけですよね?
読んだ記事によってはwebをuserに変更しています。恐らくルート保護の表記をわかりやすくするだけで特に意味はない思いますが。一般ユーザーのガードはwebのままでも問題ないですよね?
とりあえず現在以下のように設定しています。
PHP
1'defaults' => [ 2 'guard' => 'web', 3 'passwords' => 'users', 4], 5 6'guards' => [ 7 'web' => [ 8 'driver' => 'session', 9 'provider' => 'users', 10 ], 11 'api' => [ 12 'driver' => 'token', 13 'provider' => 'users', 14 ], 15 //追加 16 'admin' => [ 17 'driver' => 'session', 18 'provider' => 'admins', 19 ], 20], 21 22'providers' => [ 23 'users' => [ 24 'driver' => 'eloquent', 25 'model' => App\User::class, 26 ], 27 //追加 28 'admins' => [ 29 'driver' => 'eloquent', 30 'model' => App\Admin::class, 31 ], 32 ], 33 34'passwords' => [ 35 'users' => [ 36 'provider' => 'users', 37 'table' => 'password_resets', 38 'expire' => 60, 39 ], 40],
その他のコードも一応記載しておきます
Adminモデル
PHP
1class Admin extends Authenticatable 2{ 3 protected $fillable = [ 4 'name', 'email', 'password', 5 ]; 6 protected $hidden = [ 7 'password', 'remember_token', 8 ]; 9}
app\Exceptions\Handler.php
PHP
1//追加 2public function unauthenticated($request, AuthenticationException $exception) 3{ 4 if($request->expectsJson()){ 5 return response()->json(['message' => 'Unauthenticated'], 401); 6 } 7 if (in_array('admin', $exception->guards())) { 8 return redirect()->guest(route('admin.login')); 9 } 10 return redirect()->guest(route('login')); 11}
ルーティング
PHP
1Route::group(['prefix' => 'admin'], function(){ 2 // ログイン 3 Route::get('login', 'Admin\LoginController@showLoginForm')->name('admin.login'); 4 Route::post('login', 'Admin\LoginController@login')->name('admin.login'); 5}); 6 7Route::group(['prefix' => 'admin', 'middleware' => 'auth:admin'], function() { 8 // 管理者ホーム 9 Route::get('/home', 'Admin\HomeController@index')->name('admin.home'); 10 // ログアウト 11 Route::get('logout', 'Admin\LoginController@logout')->name('admin.logout'); 12});
LoginController
PHP
1protected $redirectTo = '/admin/home'; 2 3public function __construct() 4{ 5 $this->middleware('guest:admin')->except('logout'); 6} 7 8public function showLoginForm() 9{ 10 return view('admin.login'); 11} 12 13protected function guard() 14{ 15 return Auth::guard('admin'); 16} 17 18public function logout(Request $request) 19{ 20 Auth::guard('admin')->logout(); 21 $request->session()->flush(); 22 $request->session()->regenerate(); 23 return redirect()->route('admin.login'); 24}
app\Http\Middleware\RedirectIfAuthenticated.php
PHP
1public function handle($request, Closure $next, $guard = null) 2{ 3 if (Auth::guard($guard)->check()) { 4 if($guard === 'admin'){ 5 return redirect('/admin/home'); 6 } 7 return redirect('/home'); 8 } 9 return $next($request); 10}
参考にした記事です。
Laravel5.7でMulti Authを試す。
Laravel 5.7 マルチ認証で管理者とユーザーの認証を分ける
【Laravel】マルチログイン(ユーザーと管理者など)機能を設定してみた
何か問題点がありましたら教えてください。よろしくお願いいたします。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/03/27 09:17