多个中间件对相同的路由有权限


Multiple middleware has permittion on same routes

我有多个中间件(学生,家长,管理员),并使用该中间件创建一些路由组。但是某些路由可以访问用户是否在任何组中,是否属于任何中间件,但不能访问其他中间件,例如teacher。我在文档中使用类似的东西:http://laravel.com/docs/5.1/routing#route-groups但它的工作,当我把一个路由,当添加另一个路由组与另一个中间件它不工作。这可能吗?如何实现?

当我执行php artisan route时,它会给我一个错误

[Symfony'Component'Debug'Exception'FatalErrorException]
  Call to a member function inRole() on null

Laravel的路由中间件按照routes.php文件中的声明逐一执行。因此,如果其中一个通过抛出异常或返回一些响应来拒绝访问,则下一个中间件将不会被执行。

为了使其工作,您将需要一个中间件来检查当前用户是否具有所需的任何角色。幸运的是,从Laravel 5.1开始,你可以通过routes.php文件(参见http://laravel.com/docs/5.1/middleware#middleware-parameters)将参数传递给中间件,所以你只需要一个中间件类来处理所有的情况。

中间件类的示例如下:

class HasAnyRole
{
  public function handle($request, Closure $next, $roles)
  {
    // Return Not Authorized error, if user has not logged in
    if (!$request->user) {
      App::abort(401);
    }
    $roles = explode(',', $roles);
    foreach ($roles as $role) {
      // if user has given role, continue processing the request
      if ($request->user->hasRole($role)) {
        return $next($request);
      }
    }
    // user didn't have any of required roles, return Forbidden error
    App::abort(403);
  }  
}

Kernel.php:

中注册中间件
protected $routeMiddleware = [
  'has_any_role' => 'App'Http'Middleware'HasAnyRole',
];
现在,在你的routes.php中,你可以像这样将中间件应用到一个组:
//this route is available only to users with role admin or author
Route::put('post/{id}', ['middleware' => 'has_any_role:admin,author', function ($id) {
    //
}]);

这应该可以达到目的,只要确保您的User类有一个hasRole方法。