laravel5.5で、認証の種類(guard)によってリダイレクト先のログインURLを振り分ける
参照URL: https://stackoverflow.com/questions/45340855/laravel-5-5-change-unauthenticated-login-redirect-url
例えば、楽天のような企業別ECサイトの場合(企業毎にユーザのログイン画面があるパターン)
一般ユーザ http://ec.com/user/12345/login
企業管理者 http://ec.com/company/12345/login
システム管理管理者 http://ec.com/admin/login
laravelの標準の認証を使うと、ログインに失敗するとhttp://ec.com/login にリダイレクトされてしまう。
それだと困るので、それぞれ失敗したログイン画面(URL毎に守られている認証別)にリダイレクト先を振り分けたい。
app/Exceptions/Handler.phpで、振り分け先ロジックを実装する。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
public function render($request, Exception $exception) { $class = get_class($exception); switch($class) { // 認証エラーの場合、どの認証に失敗したかによって、ログインURLを振り分ける case 'Illuminate\Auth\AuthenticationException': $guard = array_get($exception->guards(), 0); switch ($guard) { case 'user': $login = 'shop/' . session('shop_id') .'/login'; break; case 'company_admin': $login = 'company_admin/' . session('company_id') .'/login'; break; case 'admin': $login = 'admin/login'; break; default: $login = 'login'; break; } return redirect($login); } // それ以外のエラーは、そのまま画面に表示 return parent::render($request, $exception); } |
どのURLにアクセスしているかは、セッション変数で識別する
web.php
1 2 3 4 5 6 7 8 |
Route::group(['prefix' => 'company_admin/{company_id}'], function($company_id) { Route::get('/', function ($company_id) { return redirect('/company_admin/'. $company_id .'/login'); }); Route::get('login', 'Company_admin\LoginController@showLoginForm')->name('company_admin.login'); Route::post('login', 'Company_admin\LoginController@login')->name('company_admin.login'); }); |
app/Http/Controller/Company_admin/LoginController.php
1 2 3 4 5 6 |
public function showLoginForm($company_id) { // 企業IDをセッション変数に格納して、どこからでも使えるようにする session(['company_id' => $company_id]); return view('company_admin.login', compact('company_id')); } |