【问题标题】:Route group with multiple middleware checks具有多个中间件检查的路由组
【发布时间】:2019-12-16 05:39:27
【问题描述】:

在我的 laravel 项目中,我创建了自己的角色并将它们添加到中间件,这样我就可以使用 auth.adminauth.superadmin 来保护特定的路由。

我的超级管理员角色有一个 Route::Group,我的管理员角色有一个 Route::Group,标准身份验证检查有一个 Route:Group。

现在我有一个必须由超级管理员和管理员访问的特定路由。 当我将路由放在管理员组或超级管理员组中时,它可以工作。但是,当我尝试将它放在两者中或创建一个路由组时,我检查这两个角色时它不会。 然后我尝试像这样制作一个 Route::Group:

Route::group(['middleware' => ['auth','auth.admin', 'auth.superadmin']], function() {
        Route::resource('user', 'UserController', ['except' => ['show']]);
});

我以为这会解决我的问题,但它没有。

如何创建一个只有管理员和超级管理员才能访问路由的路由组。

【问题讨论】:

  • 创建一个新的中间件来检查用户是否有任何一个角色。
  • 这应该可以。你遇到了什么错误??
  • @zahidhasanemon 我认为它会起作用,我没有收到任何错误,但我被重定向到 /home。我是否将路线放在它工作的角色组之一中,但如果我将它们组合起来它们都不起作用,我只会被重定向。

标签: laravel laravel-middleware laravel-route


【解决方案1】:

重写您的中间件以使用如下设置:

Route::get('/home', ['middleware' => 'roles:admin,superadmin', function () {
   echo '/home';
}]);

然后使用... 运算符,您可以轻松地将参数$roles 作为数组检查:

// YourMiddleware.php
public function handle($request, Closure $next, ...$roles)

【讨论】:

  • 我了解此选项可能有效。我可能很固执,但我想知道为什么我的解决方案不起作用。只是这样我可以从中学习。
  • 首先,您在中间件中复制了逻辑。他们都在检查角色。下一步:中间件是串联运行的,这意味着如果auth.admin 失败(用户不是管理员),那么该中间件会重定向到例如 403 页面。您不能也不应该在中间件之间进行OR 比较。
猜你喜欢
  • 2021-09-10
  • 1970-01-01
  • 2012-08-09
  • 2012-07-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-08-23
相关资源
最近更新 更多