具体看这篇文章:
Laravel 5.3 不同用户表登录认证
需要优化的地方:不需要新增中间件,【后台管理认证中间件】部分全部去掉,使用框架自带的中间件传参就行了。
Admin/LoginController.php 中修改中间件:
$this->middleware('guest.admin', ['except' => 'logout']);
修改为:
$this->middleware('guest:admin', ['except' => 'logout']);
仅仅改了个冒号,冒号后面即为参数,给默认的guest中间件传参。
修改guest中间件App\Http\Middleware\RedirectIfAuthenticated.php:
public function handle($request, Closure $next, $guard = null)
{
if (Auth::guard($guard)->check()) {
switch ($guard) {
case 'admin':
return redirect('/admin');
break;
default:
return redirect('/home');
break;
}
}
return $next($request);
}
根据guard名来重定向,已登陆时,访问登录页面跳转的地址。
修改路由:
Route::group(['middleware' => 'auth.admin'], function () {
Route::get('/', 'Admin\IndexController@index');
});
为:
Route::group(['middleware' => 'auth:admin'], function () {
Route::get('/', 'Admin\IndexController@index');
});
仅仅改了个冒号,冒号后面即为参数,给默认的auth中间件传参。
修改App\Exceptions\Handler.php的unauthenticated()方法:
protected function unauthenticated($request, AuthenticationException $exception)
{
if ($request->expectsJson()) {
return response()->json(['error' => 'Unauthenticated.'], 401);
}
$guards = $exception->guards();
$guard = ! empty($guards) ? $guards[0] : null;
switch ($guard) {
case 'admin':
return redirect()->guest('admin/login');
break;
default:
return redirect()->guest('login');
break;
}
}
这里也是根据guard名来重定向,未登陆时,访问需要登陆的页面跳转的地址。
注:
默认的auth中间件(Illuminate\Auth\Middleware\Authenticate),在验证失败后,会抛出异常
throw new AuthenticationException('Unauthenticated.', $guards);
抛出异常后会触发App\Exceptions\Handler类的unauthenticated()方法。