12、Laravel 11 通过中间件进行权限控制

作者: 温新

图书: 【Laravel 11 构建 Web 应用与管理后台】

阅读: 170

时间: 2024-05-16 20:05:27

上节我们完成了分类的 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');

});
请登录后再评论