12、Laravel 11 通过中间件进行权限控制
上节我们完成了分类的 CURD 操作,但是没有对权限进行验证。因此,只要登录的用户都可以对分类进行操作。这并不是我们想要的。
在介绍 Breeze 时我们看到过 auth 路由,其中就有 auth 中间件,它允许登录的用户访问 Routes。
中间件会在路由之前执行一些检查,如果返回 false,则会显示错误或重定向到某个错误页面。例如,如果有人试图访问受 auth 中间件保护的 /dashboard URL,他们将自动被重定向到登录页面。
中间件验证
为了让分类登录后才可以访问,我们需要把路由加入到中间件中。
routes/web.php
...
    
Route::middleware('auth')->group(function () {
    Route::get('/profile', [ProfileController::class, 'edit'])->name('profile.edit');
    Route::patch('/profile', [ProfileController::class, 'update'])->name('profile.update');
    Route::delete('/profile', [ProfileController::class, 'destroy'])->name('profile.destroy');
    Route::resource('categories', \App\Http\Controllers\CategoryController::class);
    
});
...
如此,只有登录后的用户才可以对分类进行操作,这还不够。我们需要只有管理员才能进行操作,因此,我们还需要一个中间件进行管理员权限验证。
权限验证
1、创建中间件
$ php artisan make:middleware IsAdminMiddleware
2、验证权限
app/Http/Middleware/IsAdminMiddleware.php
<?php
namespace App\Http\Middleware;
use Closure;
use Illuminate\Http\Request;
use Symfony\Component\HttpFoundation\Response;
class IsAdminMiddleware
{
    /**
     * Handle an incoming request.
     *
     * @param  \Closure(\Illuminate\Http\Request): (\Symfony\Component\HttpFoundation\Response)  $next
     */
    public function handle(Request $request, Closure $next): Response
    {
        if (!auth()->user()->is_admin) {
            abort(403);
        }
        return $next($request);
    }
}
在我们创建的中间件中,如果 User 表中的 is_admin 字段为 false,我们必须以 forbidden 状态终止请求。当前已认证用户可以通过 Laravel 助手函数 auth()->user() 获取,然后调用所需的字段。
3、注册中间件
我们必须注册我们的中间件以便用作别名。中间件在 bootstrap/app.php 文件中进行注册
bootstrap/app.php
<?php
use Illuminate\Foundation\Application;
use Illuminate\Foundation\Configuration\Exceptions;
use Illuminate\Foundation\Configuration\Middleware;
return Application::configure(basePath: dirname(__DIR__))
    ->withRouting(
        web: __DIR__.'/../routes/web.php',
        commands: __DIR__.'/../routes/console.php',
        health: '/up',
    )
    ->withMiddleware(function (Middleware $middleware) {
        $middleware->alias([
            'is_admin' => \App\Http\Middleware\IsAdminMiddleware::class,
        ]);
    })
    ->withExceptions(function (Exceptions $exceptions) {
        //
    })->create();
4、使用中间件
哪些路由需要使用验证,就在哪些路由使用此中间件。
routes/web.php
...
    
Route::middleware('auth')->group(function () {
	...
    Route::resource('categories', \App\Http\Controllers\CategoryController::class)->middleware('is_admin');
});
                请登录后再评论