2016-09-06 17 views
6

Tôi có hai loại cho người dùng và tôi đã tạo nhiều phần tử trung gian.Cách sử dụng phần mềm trung gian 'OR' cho đường dẫn laravel 5

Một số tuyến đường cần cho phép đối với cả hai loại người dùng.

Tôi đã cố gắng mã sau:

Route::group(['namespace' => 'Common', 'middleware' => ['Auth1', 'Auth2']], function() { 
    Route::get('viewdetail', array('as' => 'viewdetail', 'uses' => '[email protected]')); 
}); 

Nhưng nó không làm việc :(

+0

phù hợp nhất cho phép (cửa và chính sách) so với middlewares –

Trả lời

7

Middleware là nghĩa vụ phải hoặc trả lại một phản ứng hoặc vượt qua các yêu cầu xuống các đường ống dẫn middlewares là độc lập với nhau.

Bạn sẽ cần phải triển khai phần mềm trung gian riêng biệt cho phép 2 vai trò hoặc phần mềm trung gian duy nhất nhận vai trò được phép làm tham số

Tùy chọn 1: chỉ cần tạo phần mềm trung gian là phiên bản kết hợp của Auth1 và Auth2 để kiểm tra 2 loại người dùng. Đây là tùy chọn đơn giản nhất, mặc dù không thực sự linh hoạt.

Lựa chọn 2: kể từ phiên bản 5.1 middlewares có thể mất các thông số - xem thêm chi tiết ở đây: https://laravel.com/docs/5.1/middleware#middleware-parameters. Bạn có thể triển khai một phần mềm trung gian duy nhất sẽ lấy danh sách vai trò người dùng để kiểm tra và chỉ xác định các vai trò được phép trong tệp tuyến đường của bạn. Các mã sau đây nên làm như lừa:

// define allowed roles in your routes.php 
Route::group(['namespace' => 'Common', 'middleware' => 'checkUserRoles:role1,role2', function() { 
    //routes that should be allowed for users with role1 OR role2 go here 
}); 

// PHP < 5.6 
// create a parametrized middleware that takes allowed roles as parameters 
public function handle($request, Closure $next) { 

    // will contain ['role1', 'role2'] 
    $allowedRoles = array_slice(func_get_args(), 2); 

    // do whatever role check logic you need 
} 

// PHP >= 5.6 
// create a parametrized middleware that takes allowed roles as parameters 
public function handle($request, Closure $next, ...$roles) { 

    // $roles will contain ['role1', 'role2'] 

    // do whatever role check logic you need 
} 
1

Ví dụ này How to pass multiple parameters to middleware with OR condition in Laravel 5.2

Thay vì thêm nhiều đối số cho phương pháp xử lý của bạn và cần phải cập nhật nó mỗi khi bạn thêm một vai trò mới để ứng dụng của bạn, bạn có thể làm cho nó năng động.

Middleware

Route

Route::group(['middleware' => ['role_check:default,admin,manager']], function() { 
    Route::get('/user/{user_id}', array('uses' => '[email protected]', 'as' => 'showUserDashboard')); 
}); 

này sẽ kiểm tra nếu người dùng xác thực có ít nhất một trong những vai trò cung cấp và nếu như vậy, vượt qua yêu cầu đến trung tiếp theo cây rơm. Tất nhiên phương thức hasRole() và bản thân các vai trò sẽ cần được bạn thực hiện.

Bạn có thể sử dụng php 5,6

public function handle($request, Closure $next, ...$roles) 
{ 
    foreach ($roles as $role) { 

     try { 
      if ($request->user()->can($role)) { 
       return $next($request); 
     } 

     } catch (ModelNotFoundException $exception) { 
      abort(403); 
     } 
    } 

} 
Các vấn đề liên quan