【问题标题】:Multiple middleware has permittion on same routes多个中间件在同一路由上具有许可
【发布时间】:2015-08-23 11:15:27
【问题描述】:

我有多个中间件(学生、家长、管理员)并使用该中间件创建一些路由组。但是,如果用户在任何组中并且属于任何中间件,则某些路由可以访问,但如果在其他中间件示例教师中则不能访问。我在文档中使用类似的东西: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

【问题讨论】:

  • 请将中间件的代码粘贴到运行 inRole() 方法的位置

标签: php laravel routes laravel-5.1


【解决方案1】:

Laravel 的 route 中间件 会按照 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 方法。

【讨论】:

  • TNX @jedrzej.kurylo。这是我在堆栈中得到的最佳答案!谢谢你!列出路由时仍然有错误,可能是因为我使用了哨兵包,但我没有看到错误,但我试图找出它。 TNX。
  • 没关系,我发现了一个问题...在控制器中我使用了 if(Sentiel::hasRole('student') 并且当我在 if(!Sentiel::gest()) . 谢谢@jedrzej.kurylo。你是最棒的!
猜你喜欢
  • 2019-12-10
  • 1970-01-01
  • 2017-08-11
  • 2019-12-16
  • 1970-01-01
  • 2021-09-10
  • 1970-01-01
  • 2020-10-26
  • 1970-01-01
相关资源
最近更新 更多