2017-06-23 71 views
8

我有多個管理系統:一個是超級管理員,另一個是正常的管理員,通過用戶表中的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應該只看到id 3和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而失敗,因此兩個用戶都無法訪問。 路線組應分開superadmin和normaladmin。然後從你的控制器,你可以通過where子句,以實現輸出 – Hari

+3

在這一刻,你可以簡化你的中間,只使用一個檢查'is_admin> 0'中間件是不是去隱藏內容/按鈕或其他行動的方式基於管理水平。我建議您查看Gate/Policies https://laravel.com/docs/5.4/authorization以檢查操作的權限。使用你的AdminMiddleware來檢查用戶是否被允許訪問路由並使用門/策略對象檢查單個路由 – Ken

+0

@Ken得到一個加號。一個超級用戶和普通用戶最好通過他們扮演的角色和他們擁有的權限來區分。您也可以考慮ACL軟件包,例如[entrust](https:// github。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'。如果你想控制管理員的操作,我認爲中間件不能解決問題。如前所述,在操作數據庫數據時,判斷他是否是超級管理員。