【问题标题】:How to use 'OR' middleware for route laravel 5如何为路由 laravel 5 使用“或”中间件
【发布时间】:2016-09-06 09:00:43
【问题描述】:

我有两种类型的用户,我已经创建了多个中间件。

有些路线需要同时允许两种类型的用户。

我正在尝试以下代码:

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

但它不起作用:(

【问题讨论】:

  • 比中间件更适合授权(门和策略)

标签: php laravel laravel-5 laravel-5.2


【解决方案1】:

中间件应该要么返回响应,要么将请求传递到管道中。中间件相互独立,不应该知道其他中间件在运行。

您需要实现一个允许 2 个角色的单独中间件或将允许的角色作为参数的单个中间件。

选项 1:仅创建一个中间件是 Auth1 和 Auth2 的组合版本,用于检查 2 种用户类型。这是最简单的选择,虽然不是很灵活。

选项 2:因为 5.1 版 中间件可以接受参数 - 在此处查看更多详细信息:https://laravel.com/docs/5.1/middleware#middleware-parameters。您可以实现一个中间件,该中间件将获取用户角色列表以进行检查,并在您的路由文件中定义允许的角色。以下代码应该可以解决问题:

// 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
}

【讨论】:

    【解决方案2】:
    Route::group(['middleware' => 'role:manager,admin'], function () {}
    

    在名为“角色”的中间件中,您可以将参数分解为数组

    public function handle($request, Closure $next, ...$roles)
    {
        $userRole = $request->user()->role;
    
        if (! $userRole || ! in_array($userRole->name, $roles)) {
            abort(403);
        }
    
        return $next($request);
    }
    

    【讨论】:

      【解决方案3】:

      这个例子 How to pass multiple parameters to middleware with OR condition in Laravel 5.2

      您无需向句柄方法添加多个参数并且每次向应用程序添加新角色时都必须更新它,您可以使其动态化。

      中间件

       /**
       * Handle an incoming request.
       *
       * @param $request
       * @param Closure $next
       * @return \Illuminate\Http\RedirectResponse|\Illuminate\Routing\Redirector
       */
      public function handle($request, Closure $next) {
      
          $roles = array_slice(func_get_args(), 2); // [default, admin, manager]
      
          foreach ($roles as $role) {
      
              try {
      
                  Role::whereName($role)->firstOrFail(); // make sure we got a "real" role
      
                  if (Auth::user()->hasRole($role)) {
                      return $next($request);
                  }
      
              } catch (ModelNotFoundException $exception) {
      
                  dd('Could not find role ' . $role);
      
              }
          }
      
          Flash::warning('Access Denied', 'You are not authorized to view that content.'); // custom flash class
      
          return redirect('/');
      }
      

      路线

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

      这将检查经过身份验证的用户是否具有至少一个提供的角色,如果是,则将请求传递到下一个中​​间件堆栈。当然hasRole() 方法和角色本身需要你自己实现。

      可以使用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);
              }
          }
      
      }
      

      【讨论】:

        【解决方案4】:

        你可以简单地使用这样的语法,这意味着如果有其中之一

        
         Route::group(['middleware' => ['role:first|second|third|....']], function () {});
        

        【讨论】:

          猜你喜欢
          • 2015-08-12
          • 2021-12-29
          • 2016-06-03
          • 2019-01-13
          • 2015-09-22
          • 2016-02-02
          • 2015-08-31
          • 2015-12-27
          • 2018-05-11
          相关资源
          最近更新 更多