2017-06-23 3 views
8

私は複数の管理システムを持っています:1つはスーパー管理者で、もう1つは通常の管理者で、ユーザテーブルのis_admin属性で区別されます。複数のAdminMiddlewareのあいまいさ

そして、これら二つのミドルウェア: SuperAdminMiddleware.php

public function handle($request, Closure $next, $guard = null) 
{ 
    if(Auth::check()) 
    { 
     if($request->user()->is_admin==1) 
     { 
      return $next($request); 
     } 
     return redirect('/login');  
    } 
    else 
    { 
     return redirect('/login'); 
    } 
} 

と、NormalAdminMiddleware.php

public function handle($request, Closure $next, $guard = null) 
{ 
    if(Auth::check()) 
    { 
     if($request->user()->is_admin==2) 
     { 
      return $next($request); 
     } 
     return redirect('/login');  
    } 
    else 
    { 
     return redirect('/login'); 
    } 
} 

とloginControllerで:

protected function authenticated() 
{ 
    if (auth()->user()->is_admin==1) { 
    return redirect('/super-admin'); 
    } 

    else if(auth()->user()->is_admin==2){ 
    return redirect('/normal-admin'); 
    } 

    else { 
    return redirect('/home'); 
    } 
} 

ここで、削除と読み取りは、スーパー管理者がすべてのユーザーの詳細を削除して見ることができるように設計されていますが、通常の管理者は自分の市のユーザーしか見ることができません。

id name city is_admin 
1 Non Maety 1 
3 Pom Lorey 2 
4 Rom Lorey 0 
2 Yer Easter 0 

ノンはすべて見ることができるはずです。 PomはID3と4だけを表示するはずです。

SuperAdminMiddlewareでルートを表示して削除すると、通常の管理者は都市のレコードを見ることができませんでした。

Route::group(['middleware' => ['App\Http\Middleware\SuperAdminMiddleware']], function() { 
    Route::get('/show/{id}', '[email protected]');  
    Route::post('/delete', '[email protected]'); 
    }); 

と私はSuperAdminMiddlewareとNormalAddminMiddlewareの両方でこれらのルートを置く場合。 NormalAdminMiddlewareは他の都市のレコードも見ることができます。

Route::group(['middleware' => ['App\Http\Middleware\NormalAdminMiddleware']], function() { 
     Route::get('/show/{id}', '[email protected]');  
     Route::post('/delete', '[email protected]'); 
     }); 

この状況をどのように克服できますか?

+0

最初にミドルウェアの条件に従って、両方を使用している場合、いずれのミドルウェアもsuperadminとnormaladminの両方で失敗するため、両方のユーザーはアクセスできません。 スーパーグループとnormaladminのルートグループを区切る必要があります。あなたのコントローラからは、出力を達成するためにwhere句を渡すことができます – Hari

+3

この時点で、あなたは中間を簡素化し、 'is_admin> 0 'のチェックを1つだけ使用できます。ミドルウェアは、コンテンツ/ボタンや、レベル。アクションの権限を確認するには、Gate/Policiesのhttps://laravel.com/docs/5.4/authorizationを調べることをお勧めします。 AdminMiddlewareを使用して、ユーザーがルートにアクセスすることが許可されているかどうかを確認し、ゲート/ポリシーオブジェクトを使用して個々のルートを確認してください。 – Ken

+0

@Kenは+1を取得します。スーパーユーザーとノーマルユーザーは、自分が果たす役割とアクセス許可によって最も区別されます。また、[entrust](https:// githubなど)などのACLパッケージを検討することもできます。com/Zizaco/entrust)または[Sentinel](https://github.com/cartalyst/sentinel)を参照してください。 – joshuamabina

答えて

5

あなたは政策とそれを解決することができます。ユーザーが認証されたユーザーモデルになり

class UserPolicy 
{ 

    /** 
    * Determine if the given user can be viewed by the user. 
    * 
    * @param \App\User $user 
    * @param \App\User $account 
    * @return bool 
    */ 
    public function view(User $user, User $account) 
    { 
     switch($user->is_admin) { 
      case 1: 
       return true; 
      case 2: 
       return $user->city == $account->city; 
      default: 
      return 0; 

     } 
    } 

    /** 
    * Determine if the given user can be updated by the user. 
    * 
    * @param \App\User $user 
    * @param \App\User $account 
    * @return bool 
    */ 
    public function update(User $user, User $account) 
    { 
     switch($user->is_admin) { 
      case 1: 
       return true; 
      case 2: 
       return $user->city == $account->city; 
      default: 
      return 0; 

     } 
    } 
} 

、アカウントが表示されなければならないユーザモデルになります。

あなたのポリシー(https://laravel.com/docs/5.4/authorization#registering-policies)を登録した後、あなたはあなたのようなコントローラーの機能でそれを呼び出すことができます。

public function show(User $user) { 
    $this->can('view', $user); 
} 
0

私は質問を読むことによって明確にあなたの目的を理解していません。 SuperAdminMiddlewareの下にメソッドを置くと、通常の管理者は拒否され、 '/ login'にリダイレクトされます。管理者の操作を制御したいのであれば、ミドルウェアは問題を解決できないと思います。前回の解答と同様に、データベースのデータを操作するときは、superAdminかどうかを判断してください。

関連する問題