【发布时间】:2021-07-24 17:06:24
【问题描述】:
我在我的项目中使用 Laravel 8,在这个项目中,我创建了一个名为 Admin 的自定义中间件,如下所示:
public function handle(Request $request, Closure $next)
{
if (Auth::check()) {
if (Auth::user()->isAdmin()) {
return $next($request);
}
}
return redirect('/');
}
我试着像这样应用它:
Route::group(['middleware' => 'admin'], function() {
Route::resource('admin/users', App\Http\Controllers\Admin\AdminUserController::class);
});
在Kernel.php:
'admin' => \App\Http\Middleware\Admin::class
所以我在用户模型中调用了isAdmin(),它只是检查用户的角色是否正确:
public function roles()
{
return $this->belongsToMany(Role::class);
}
public function isAdmin()
{
foreach ($this->roles as $role) {
if ($role->name == 'Manual User') {
return true;
}
}
return false;
}
目前,我有这两个角色:
而我要登录的用户设置为 6 并且角色 ID 为 1 其中Manual User:
但现在的问题是,当我转到 /admin/users uri 时,它不会将我重定向到 ('/') uri 并显示/admin/users 页面!
那么这里出了什么问题?我该如何解决这个问题?
请注意,roles 和 users 之间的关系是多对多,可以正常工作,无需提及它们。
【问题讨论】:
-
从健全性检查开始。将
dd('test')作为handle 方法的第一行,看看它是否首先被调用。 -
@kmuenkel 我放了那个,但是当我转到
/uri 和/admin/usersuri 时,屏幕上什么也没有。为什么会这样? -
不确定。在
App\Http\Kernel中,你的中间件在$routeMiddleware数组中被引用,是吗? -
让我们再做一次检查。这将验证 Route 定义是否如您所想。有时动态路由会有点踩到你的脚趾,如果它们以错误的顺序定义,将路径节点误认为参数并发送到错误的控制器。在 AdminUserController 中,确保您正在试验的方法在
$request对象中进行类型提示并添加:$route = $request->route(); dd(['path' => '('.$request->method().')'.urldecode($route->uri()), 'name' => $route->getName()]);
标签: php laravel middleware laravel-8 laravel-middleware