認証のsession分離

管理者と一般ユーザーログインページを実装し挙動を確認したが、sessionを更新する状態となっていため解消する必要があった。 ①userでログイン→session(user依存)保存

②adminでログイン→session(user依存)更新

タイトル通りsessionを分けて保存するように実装する。

①userでログインした場合はuserのセッションを保存

②adminでログインした場合はadminのセッションを保存

LoginController.php

 <?php

 namespace App\Http\Controllers\Auth;

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

 class LoginController extends Controller {

 ^   use AuthenticatesUsers;

 ^   /**
 ^    * Where to redirect users after login.
 ^    *
 ^    * @var string
 ^    */
 ^   protected $redirectTo = '/home';

 ^   /**
 ^    * Create a new controller instance.
 ^    *
 ^    * @return void
 ^    */

 ^   // middlewareのコンストラクトを確認する
 ^   public function __construct() {
 ^   ^   $this->middleware('guest')->except('logout');
 ^   }

 ^   // 追加
 ^   protected function guard() {
 ^   ^   return Auth::guard('user');
 ^   }

 ^   public function logout(Request $request) {
 ^   ^   Auth::guard('user')->logout();
 ^   ^   return $this->loggedOut($request);
 ^   }

 ^   // ログアウトした時のリダイレクト先
 ^   public function loggedOut(Request $request) {
 ^   ^   return redirect(route('login'));
 ^   }
 }

LoginController.php

  <?php
  namespace App\Http\Controllers\Admin\Auth;
  
  //use App\Http\Controllers\Admin; // モデルを App\User から変更
  use App\Admin; // モデルを App\User から変更
  
  //use App\Http\Controllers\Admin\Auth;   // 追加
  use App\Http\Controllers\Controller;
  use Illuminate\Foundation\Auth\AuthenticatesUsers;
  use Illuminate\Http\Request;
  use Illuminate\Support\Facades\Auth;
  
  class LoginController extends Controller {
  
  ^   use AuthenticatesUsers;
  
  ^   /**
  ^    * Where to redirect users after login.
  ^    * ログイン後にユーザーをリダイレクトする場所。
  ^    *
  ^    * @var string
  ^    */
  ^   protected $redirectTo = 'admin/home';
  
  ^   /**
  ^    * Create a new controller instance.
  ^    * 新しいコントローラーインスタンスを作成します。
  ^    *
  ^    * @return void
  ^    */
  
  ^   // loginメソッドはないがmiddlewareのコンストラクトを確認する
  ^   // App\Http\Kernel.phpへ
  ^   public function __construct() {
  ^   ^   $this->middleware('guest:admin')->except('logout');
  ^   }
 
  ^   public function showLoginForm() {
  ^   ^   return view('admin.login');
  ^   }
  
  ^   protected function guard() {
  ^   ^   return Auth::guard('admin');
  ^   }
  
  ^   public function logout(Request $request) {
  ^   ^   Auth::guard('admin')->logout();
  ^   ^   return $this->loggedOut($request);
  ^   }
  
  ^   public function loggedOut(Request $request) {
  ^   ^   $request->session()->regenerate();
  ^   ^   return redirect('/admin/login');
  ^   }
  }

.envファイル

// コード規約に則り、"="の前後に空白を設けていた。
SESSION_COOKIE=auth
SESSION_COOKIE_ADMIN=auth-admin

Middleware

  <?php
  
  namespace App\Http\Middleware;
  
  use Closure;
  use Illuminate\Support\Facades\Auth;
  
  class RedirectIfAuthenticated
  {                                          
  ^   /**                                    
  ^    * Handle an incoming request.       
  ^    *
  ^    * @param  \Illuminate\Http\Request  $request
  ^    * @param  \Closure  $next           
  ^    * @param  string|null  $guard       
  ^    * @return mixed
  ^    */
  ^   public function handle($request, Closure $next, $guard = null)
  ^   {
  ^   ^   $redirectTo = "/home";
  
  ^   ^   // 管理者なら管理画面用ホームのパスを設定する
  ^   ^   if ($guard === "admin") {
  ^   ^   ^   $redirectTo = "/admin/home";
  ^   ^   }
  
  ^   ^   if (Auth::guard($guard)->check()) {
  ^   ^   ^   return redirect($redirectTo);
  ^   ^   }
  
  ^   ^   return $next($request);
  ^   }
  }

Exception

  <?php

  namespace App\Exceptions;

  use Exception;
  use Illuminate\Auth\AuthenticationException;
  use Illuminate\Foundation\Exceptions\Handler as ExceptionHandler;
  
  class Handler extends ExceptionHandler
  {
        ...
  ^   public function unauthenticated($request, AuthenticationException $exception)
  ^   {
  ^   ^   if($request->expectsJson()) {
  ^   ^   ^   return response()->json(['message' => $exception->getMessage()], 401);
  ^   ^   }
  ^   ^   if (in_array('admin', $exception->guards())) {
  ^   ^   ^   return redirect()->guest(route('admin.login'));
  ^   ^   }
  ^   ^   return redirect()->guest(route('login'));
  ^   }
  };