как проверить значение базы данных в middleware laravel 5.2

У меня есть представление, которое должно быть доступно только пользователям, которые имеют «role = interviewer» в базе данных.Я создал промежуточное программное обеспечение и зарегистрировал его, но оно, похоже, работает не так, как ожидалось. Это позволяет всем пользователям независимо от их роли, хранящейся в БД.

Вот мой middleware

class Interviewer
{
    public function handle($request, Closure $next)
    {
        if($request->user()->role == "interviewer"){
             return $next($request);
        }           
    }
}

Я не знаю, если подход правильный, я также пытался

if($request->Auth::user()->role == "interviewer")

Этот тоже не работает. admin-это представление, которое должно быть ограничено, если у пользователя нет роли интервьюера. Вот мой маршрут

Route::get('/candidates', [
    'uses' => 'candidateController@showProfile',
    ])->middleware('auth','interviewer');

My route middlewars

    protected $routeMiddleware = [
    'auth' => AppHttpMiddlewareAuthenticate::class,
    'auth.basic' => IlluminateAuthMiddlewareAuthenticateWithBasicAuth::class,
    'can' => IlluminateFoundationHttpMiddlewareAuthorize::class,
    'guest' => AppHttpMiddlewareRedirectIfAuthenticated::class,
    'throttle' => IlluminateRoutingMiddlewareThrottleRequests::class,
    'interviewer'=> AppHttpMiddlewareInterviewer::class,
];

2 ответа

  1. Вам нужно вернуть что-то в вашем middleware, если это должно произойти, в вашем случае ответ на ошибку.

    namespace App\Core\Http\Middleware;
    
    use Tymon\JWTAuth\Middleware\BaseMiddleware;
    use Tymon\JWTAuth\Exceptions\JWTException;
    use Tymon\JWTAuth\Exceptions\TokenExpiredException;
    
    class Employee extends BaseMiddleware
    {
        /**
         * Handle an incoming request.
         *
         * @param  \Illuminate\Http\Request  $request
         * @param  \Closure  $next
         * @return mixed
         */
        public function handle($request, \Closure $next, $role = null)
        {
            $user = $request->user();
    
            if (! ($user->authenticable instanceof \App\Core\Entities\User)) {
                return response([
                    'title'  => 'You may not call this API as a non-employee.',
                    'error'  => 'invalid_user_type'
                ], 401); // <-- See? I returned an error!
            }
    
            if ($role) {
                if (strtolower($user->authenticable->role->name) !== strtolower($role)) {
                    return response([
                        'title'  => "You may not call this API as a \"{$user->authenticable->role->name}\".",
                        'error'  => 'unnecessary_permissions'
                    ], 401); // And also here!
                }
            }
    
            return $next($request);
        }
    }
    

  2. В вашем middleware вам всегда нужноreturn next($request)

    class Interviewer { 
        public function handle($request, Closure $next) { 
            if($request->user()->role != "interviewer"){
                 return back(); 
            } 
            return $next($request);
        } 
    }
    

    Также измените свой routes.php. Промежуточное ПО должно быть в массиве:

    Route::get('/candidates', [
        'uses' => 'candidateController@showProfile',
    ])->middleware(['auth','interviewer']);