我有多個管理系統:一個是超級管理員,另一個是正常的管理員,通過用戶表中的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]');
});
我該如何克服這種情況?
首先根據您的中間件條件,如果您使用兩者,那麼任何中間件都會因superadmin和normaladmin而失敗,因此兩個用戶都無法訪問。 路線組應分開superadmin和normaladmin。然後從你的控制器,你可以通過where子句,以實現輸出 – Hari
在這一刻,你可以簡化你的中間,只使用一個檢查'is_admin> 0'中間件是不是去隱藏內容/按鈕或其他行動的方式基於管理水平。我建議您查看Gate/Policies https://laravel.com/docs/5.4/authorization以檢查操作的權限。使用你的AdminMiddleware來檢查用戶是否被允許訪問路由並使用門/策略對象檢查單個路由 – Ken
@Ken得到一個加號。一個超級用戶和普通用戶最好通過他們扮演的角色和他們擁有的權限來區分。您也可以考慮ACL軟件包,例如[entrust](https:// github。com/Zizaco/entrust)或[Sentinel](https://github.com/cartalyst/sentinel)。 – joshuamabina