認証の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')); ^ } };