2017-05-13 6 views
1

「MustBeAdmin」と「MustBeUser」と呼ばれる2つのミドルウェアを作成し、ユーザーのログインに応じて正しいページにリダイレクトし、許可されていないコンテンツを制限していることを確認しました。現在、すべて正常に動作しており、リダイレクトもうまく機能しています。しかし、私がシーンの背後に書いた論理は私にとって間違っているように見えます。もし私が一番よく思っているロジックを書いたら、期待通りに動作しないようです。Laravel 5.4ミドルウェア管理者用とユーザー役割

ユーザーテーブル

id (1,2,3,...) 
name 
role (1,2,3,...) 

役割テーブル

id (1,2,3,...) 
role (Student, Admin,...) 

MustBeAdminミドルウェア

public function handle($request, Closure $next) 
    { 
     if($request->user()->role == 2) 
     { 
      return $next($request); 
     } 
     else 
     { 
      return redirect('/admin/users'); 
     } 

    } 

MustBeUserミドルウェア:

public function handle($request, Closure $next) 
    { 
     if($request->user()->role == 1) 
     { 
      return $next($request); 
     } 
     else 
     { 
      return redirect('/admin/users'); 
     } 

    } 

kernel.php

'admin' => \App\Http\Middleware\MustBeAdmin::class, 
'user' => \App\Http\Middleware\MustBeUser::class, 

あなたは私がカーネルにミドルウェアを登録している見ることができるように。

ミドルウェアのロジックが正しいかどうかは確かに私が必要とする結果が得られていますが、疑問です。

1 = Student 
2 = Admin 

あなたはMustBeAdminミドルウェアで見た場合、私は、ユーザーの役割は、2(管理者)であれば、次の($要求)を行い、ユーザの役割が1(学生)、その後(次に何をされている場合MustBeUserミドルウェアで、私は比較しています比較しています$ request)、私は/ Adminディレクトリにelseを設定しました。

私は間違っていると感じますが、どう思いますか?

+0

なぜ両方とも同じページにリダイレクトされていますか?あなたは管理者とユーザーの他に3番目のエンティティを持っていますか?誰が管理者/ユーザーにリダイレクトされますか? –

答えて

2

ミドルウェアで認証されたユーザーの詳細を確認していません。あなたがはい、それは一つの共通ファイルに扱うことができ、同じトピックにhere

+0

5つの役割がある場合は、それを処理するための5つのミドルウェアを作成する必要がありますか?共通のファイルで管理することはできますか? – user3575353

+0

@ user3575353 artisanを使ってミドルウェアを作成し、デフォルトではミドルウェアの名前で新しいファイルを作成するので、1つのファイルで行うことはできません –

1

を私の詳細な回答を確認する必要があります

//for student 
public function handle($request, Closure $next) 
{ 

    if (Auth::check() && Auth::user()->role == 1) 
    { 
     return $next($request); 
    } 

    return redirect('/admin'); 

} 


//for admin 
public function handle($request, Closure $next) 
{ 

    if (Auth::check() && Auth::user()->role == 2) 
    { 
     return $next($request); 
    } 

    return redirect('/student'); 

} 

:ミドルウェアのようなものでなければなりません。ここで コード

public function handle($request, Closure $next) 
{ 
    $user = User::find(Auth::id()); 
    $roles = []; 
    foreach ($user->roles as $key => $value) { 
     array_push($roles, $value->pivot->role_id); 
    } 

    $routeName = Route::getFacadeRoot()->current()->uri(); 
    $route = explode('/', $routeName); 
    if ($route[0] == "teacher") { 
     if (in_array(2, $roles)) { 
      return $next($request); 
     } else { 
      return response('Unauthorized.', 401); 
     } 
    } elseif ($route[0] == "student") { 
     if (in_array(1, $roles)) { 
      return $next($request); 
     } else { 
      return response('Unauthorized.', 401); 
     } 
    } elseif ($route[0] == "admin") { 
     if (Auth::user()->admin == 1) { 
      return $next($request); 
     } else { 
      return response('Unauthorized.', 401); 
     } 
    } else { 
     if (!Auth::user()) { 
      if ($request->ajax()) { 
        return response('Unauthorized.', 401); 
      } else { 
        return redirect()->guest('admin-panel/auth/login'); 
      } 
     } 
    } 

    return $next($request); 
} 

であるあなたは、あなたの必要性に応じてロジックを変更することができます。

関連する問題