laravel 中间件未按预期工作

laravel middleware not working as expected

为了保护用户路由和管理员路由,我创建了两个中间件

我的 UserMiddleware 看起来像这样

<?php

namespace App\Http\Middleware;
use Auth;
use Closure;

class UserMiddleware
{
    /**
     * Handle an incoming request.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \Closure  $next
     * @return mixed
     */
    public function handle($request, Closure $next)
    {
        if (Auth::user()->hasRole('user')) {
            return $next($request);
        }
        throw new \Exception("Unauthorized");
    }
}

这是我的管理中间件

<?php

namespace App\Http\Middleware;
use Auth;
use Closure;
use App\Role;

class AdminMiddleware
{
    /**
     * Handle an incoming request.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \Closure  $next
     * @return mixed
     */
    public function handle($request, Closure $next)
    {
        if (Auth::user()->hasRole('admin')) {
            return $next($request);
        }
        throw new \Exception("Unauthorized");
    }
}

现在我想要的是当管理员登录时,我希望打开管理仪表板,当用户登录时,我希望打开用户仪表板,但现在,它只将我重定向到管理员路由当我尝试从用户和管理员登录时,我有这样的用户保护路由

Route::group(['middleware' => 'auth', 'user'], function () {
    //all user routes
});

和管理员保护路由

Route::group(['middleware' => 'auth', 'admin'], function () {
    //all admin routes
});

并且在我的 kernel.php 中,我还添加了

'admin' => \App\Http\Middleware\AdminMiddleware::class,
'user' => \App\Http\Middleware\UserMiddleware::class,

这就是我在控制器中验证登录的方式

$loginData = array(
    'email' => Input::get('email'),
    'password' => Input::get('password'),
    'confirmed' => 1
);

/*
 * Checking against the record in database whether the email and password is valid
 * Or the record exists in the database
 */
if (Auth::validate($loginData)) {
    if (Auth::attempt($loginData)) {
            return Redirect::intended('dashboard');
    }
}
else {
    // if any error send back with message.
    Session::flash('error', 'Invalid Email/Password Combination');
    return Redirect::to('login');
}

如何让我的中间件工作并在管理员登录时显示管理仪表板,在用户登录时显示用户仪表板。这给我带来了一个大问题。

首先,如果你想向未经授权的用户显示登录表单,你的中间件应该重定向到登录表单。为了拥有它,替换

throw new \Exception("Unauthorized");

return redirect(route('login'));

其次,您的登录控制器应该将用户重定向到与其角色相对应的仪表板。为了获得正确的重定向,替换

if (Auth::attempt($loginData)) {
  return Redirect::intended('dashboard');
}

if (Auth::attempt($loginData)) {
  return Redirect::intended(Auth::user()->hasRole('admin') ? 'admin_dashboard' : 'user_dashboard');
}

最后一个问题是您错误地将中间件应用于路由。如果你想应用多个中间件,你需要传递一个列表作为 middleware 参数。替换

['middleware' => 'auth', 'user']

['middleware' => ['auth', 'user']]