2017-06-23 16 views
8

Tôi có nhiều hệ thống quản trị: một là quản trị viên cấp cao và một là quản trị viên thông thường, được phân biệt bởi thuộc tính is_admin trong bảng người dùng.Nhiều AdminMiddleware Sự mơ hồ

Và hai middlewares này: 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'); 
    } 
} 

và trong 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'); 
    } 
} 

Bây giờ, Xóa và Đọc nên được thiết kế theo cách mà quản trị viên cấp cao có thể xóa và xem tất cả chi tiết người dùng, trong khi quản trị viên thông thường chỉ có thể nhìn thấy người dùng của thành phố.

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

Không thể xem tất cả. trong khi Pom chỉ thấy id 3 và 4.

Nếu tôi đặt hiển thị và xóa tuyến dưới SuperAdminMiddleware, Quản trị viên thông thường không thể xem hồ sơ của thành phố.

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

Và nếu tôi đặt các tuyến này dưới cả SuperAdminMiddleware và NormalAddminMiddleware. NormalAdminMiddleware cũng có thể xem các hồ sơ khác của thành phố.

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

Làm cách nào để khắc phục tình trạng này?

+0

Đầu tiên Theo điều kiện phần mềm trung gian của bạn, Nếu bạn đang sử dụng cả hai, thì bất kỳ phần mềm trung gian nào không thành công cho cả superadmin và normaladmin, Vì vậy, cả người dùng không thể truy cập. Nhóm tuyến đường phải được tách riêng cho superadmin và normaladmin. Sau đó, từ bộ điều khiển của bạn, bạn có thể vượt qua mệnh đề where để đạt được đầu ra – Hari

+3

Tại thời điểm này, bạn có thể đơn giản hóa giữa và chỉ sử dụng một lần kiểm tra 'is_admin> 0' Middleware không phải là cách để ẩn nội dung/nút hoặc các hành động khác dựa trên quản trị cấp độ. Tôi khuyên bạn nên xem xét Cổng/Chính sách https://laravel.com/docs/5.4/authorization để kiểm tra quyền đối với hành động. Sử dụng AdminMiddleware của bạn để kiểm tra xem người dùng có được phép truy cập các tuyến đường và kiểm tra các tuyến đường riêng lẻ bằng cách sử dụng các đối tượng cổng/chính sách – Ken

+0

@Ken nhận được dấu cộng. Một người dùng siêu và bình thường được phân biệt tốt nhất bởi vai trò họ chơi và quyền họ có. Bạn cũng có thể xem xét các gói ACL như [ủy thác] (https: // github.com/Zizaco/ủy thác) hoặc [Sentinel] (https://github.com/cartalyst/sentinel). – joshuamabina

Trả lời

5

Bạn có thể giải quyết nó với một chính sách:

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; 

     } 
    } 
} 

tài sẽ là mô hình xác thực người dùng, tài khoản sẽ là mô hình người dùng sẽ được xem.

Sau khi bạn đăng ký hợp đồng bảo hiểm (https://laravel.com/docs/5.4/authorization#registering-policies), bạn có thể gọi nó trong chức năng điều khiển của bạn như:

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

Tôi không hiểu mục đích của bạn rõ ràng bằng cách đọc các câu hỏi. Nếu bạn đặt các phương thức của bạn dưới SuperAdminMiddleware, quản trị viên bình thường sẽ bị từ chối và chuyển hướng đến '/ login'. Nếu bạn muốn kiểm soát hoạt động của admin, tôi nghĩ middleware không thể giải quyết được vấn đề. Như câu trả lời trước, khi vận hành dữ liệu của cơ sở dữ liệu, đánh giá liệu anh ta có phải là siêuAdmin hay không.