Laravel 5.3 不同用户表登录认证--优化 (1416 views)

不耳

2017-01-17 16:52:06

具体看这篇文章: 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类的render()方法捕获。捕获后,会判断错误类型,如下:

public function render($request, Exception $e)
{
    $e = $this->prepareException($e);

    if ($e instanceof HttpResponseException) {
        return $e->getResponse();
    } elseif ($e instanceof AuthenticationException) {
        return $this->unauthenticated($request, $e);
    } elseif ($e instanceof ValidationException) {
        return $this->convertValidationExceptionToResponse($e, $request);
    }

    return $this->prepareResponse($request, $e);
}

这里根据判断,会调用unauthenticated()方法。