首页 文章

中间件无法按预期工作 - Laravel

提问于
浏览
0

我想制作一个中间件来保护laravel 5.2 app中的管理路由 . user_type不是我的数据库中的users表中的字段,而是在单独的表中:
enter image description here

管理员的user_type_id是4我制作了这个中间件:

class AdminMiddleware
{

    public function handle($request, Closure $next)
    {
        $authedUserID = Auth::id();

        $user = User::query()
                ->leftjoin('users_user_types as uut', 'uut.user_id', '=', 'users.id')
                ->where('uut.user_id',"=","$authedUserID")
                ->get(['users.*',
                        'uut.user_type_id as userType'])->first();

        if ($user['userType'] !=4)
        {

            return redirect('/home');
        }

        return $next($request);
    }
}

并把它放在kernel.php中的$ routeMiddleware数组中:

'admin' => \App\Http\Middleware\AdminMiddleware::class

这是我想要应用我的中间件的管理路由之一:

Route::get('ptyadmin', 'AdminController@show')->middleware('admin');

The Problem 是当我使用admin用户(user_type = 4)或普通用户(user_type = 1)进入此路由时,它会在两种情况下重定向到/ home!

Why does this happen and how can I fix it ??

2 回答

  • 1

    first 方法返回对象

    if ($user->userType !=4)
    

    也可以使用 select 代替 get

    ->select(['users.*','uut.user_type_id as userType'])->first();
    
  • 0

    当我在routes.php中放入jwt.auth中间件时,它可以工作:

    Route::get('ptyadmin', 'AdminController@show')
    ->middleware('jwt.auth')
    ->middleware('admin');
    

    而不是把它放在AdminController中:

    public function __construct(User $user, JWTAuth $jwtauth)
    

    {

    $this->middleware('jwt.auth', ['except' => []]);
    

    }

相关问题