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');
});
请登录后再评论