Laravel 8:自定义中间件似乎无法正常工作

Laravel 8: Custom Middleware Does Not Seem To Be Working

我正在为我的项目和这个项目使用 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 页面!

那么这里出了什么问题?我该如何解决这个问题?

请注意,rolesusers 之间的多对多关系很好,无需提及。

我在本地使用非常相似的设置进行了尝试,没有遇到任何问题。我冒昧地 changing/simplifying 一些事情。

这些是我采取的步骤。

1。中间件

1.1。创建 Admin 个中间件。

通过 运行 php artisan make:middleware Admin 命令完成。

1.2。填写中间件

<?php

namespace App\Http\Middleware;

use Closure;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;

class Admin
{
    /**
     * Passes if authenticated user is an admin.
     *
     * @see App\Models\User::isAdmin()
     */
    public function handle(Request $request, Closure $next)
    {
        if (Auth::user()->isAdmin()) {
            return $next($request);
        }

        return redirect('/');
    }
}

这是我的第一个改变:我不做 Auth::check()。还有另一个中间件。

1.3 在 App\Http\Kernel.php 中向 $middlewareGroups 添加新条目。

    protected $middlewareGroups = [
        'web' => [...],

        'api' => [...],

        // check if user is authenticated, then check if it's an admin
        'admin' => [
            'auth',
            \App\Http\Middleware\Admin::class
        ],
    ];

    protected $routeMiddleware = [
        'auth' => \App\Http\Middleware\Authenticate::class,
        ...
    ];

2。路线

添加一个使用上面创建的中间件的路由。

Route::middleware('admin')->group(function () {
    Route::get('test', function () { return "User is authenticated and is an admin."; });
});

另外,您可以选择简化 isAdmin() 方法。

public function isAdmin()
{
    return $this->roles->contains('name', 'Manual User');
}

这对我来说已经达到了预期的效果。您确定 App\Http\Kernel.php 文件编辑正确吗?