2017-04-02 12 views
0

laravel 5.2 appで管理ルートを保護するミドルウェアを作ってみたい。 USER_TYPEは私のDBにusersテーブル内のフィールドではなく、個別の表に:ミドルウェアが期待どおりに動作しない - Laravel

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); 
    } 
} 

と$ routeMiddleware配列でこれを置く: enter image description here

管理者user_type_idは、私は、このミドルウェアを作った4 ですkernel.php中:

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

、これは私が上で私のミドルウェアを適用したい管理者ルートの1つである:

Route::get('ptyadmin', '[email protected]')->middleware('admin'); 

問題は、私が管理者ユーザ(USER_TYPE = 4)、または通常のユーザでこのルートに行くとき(USER_TYPE = 1)、それは両方のケースでは/ homeにリダイレクトということです!

なぜこれが起こり、どうすれば修正できますか?

+1

どこのルートでご 'auth' middlewarがありますか? – mrabbani

+0

私はAdminControllerの内側にそれを置く: パブリック関数の__construct(ユーザー$ユーザー、JWTAuth $ jwtauth) { ます$ this->ミドルウェア( 'jwt.auth'、[=> [ ] 'を除きます']); } @mrabbani –

+1

'AdminMiddleware'の' dd(Auth :: id()) 'をダンプして値を確認しますか? – mrabbani

答えて

0

私はroutes.phpの中でjwt.authミドルウェアを入れたときにそれが機能:代わりに

Route::get('ptyadmin', '[email protected]') 
->middleware('jwt.auth') 
->middleware('admin'); 

それをAdmに入れることinController:

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

{

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

}

+0

これはなぜ起こりますか? AdminControllerに入れたら、まず管理ミドルウェアが適用されるのですか? @Mrabbani –

1

firstメソッドの戻りもselectを使用

if ($user->userType !=4) 

オブジェクトの代わりにget

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

はいオブジェクトとして使用しようとしましたが、解決する前にユーザーが認証されなかったためエラーが返されました。しかし今、これは働いています、ありがとう。 –

+0

なぜget()の代わりにselect()を使用することをお勧めしますか? @Niklesh –

+0

結果を取得し、カスタム列を選択してください:https://laravel.com/docs/5.4/queries#selects、 – C2486

関連する問題