Laravel中实现角色权限验证中间件需创建CheckRole和CheckPermission两个自定义中间件,分别校验用户角色与权限,注册到Kernel.php后通过middleware('role:admin')或middleware('permission:edit posts')应用到路由。

在 Laravel 中实现角色权限验证中间件,核心是创建自定义中间件来检查当前用户是否具有指定角色或权限,再通过 middleware 方法应用到路由或控制器上。
创建角色验证中间件
运行命令生成中间件:
php artisan make:middleware CheckRole编辑 app/Http/Middleware/CheckRole.php,在 handle 方法中判断用户角色:
- 确保用户已登录(可用
auth()->check()) - 获取用户角色(假设你用的是
spatie/laravel-permission,角色存在$user->hasRole('admin')) - 支持传入单个角色字符串或数组,如
admin或['admin', 'editor'] - 不满足条件时返回 403 响应(或重定向)
示例代码:
public function handle(Request $request, Closure $next, ...$roles)
{
if (!auth()->check()) {
return redirect('/login');
}
$user = auth()->user();
if (!$user->hasAnyRole($roles)) {
abort(403, 'Unauthorized.');
}
return $next($request);
}
创建权限验证中间件
类似地生成权限中间件:
php artisan make:middleware CheckPermission逻辑更细粒度,校验具体权限(如 edit posts、delete users):
- 使用
$user->can('delete users')(需配合spatie/laravel-permission或自定义 Gate) - 同样支持多个权限,任一满足即可(或要求全部满足,按需调整)
- 建议统一用
abort(403)保持语义清晰
示例片段:
if (!$user->can($permissions[0])) {
abort(403);
}
注册并使用中间件
在 app/Http/Kernel.php 的 $routeMiddleware 数组中注册:
'role' => \App\Http\Middleware\CheckRole::class, 'permission' => \App\Http\Middleware\CheckPermission::class,
然后在路由中使用:
Route::get('/admin/dashboard', [AdminController::class, 'index'])
->middleware('role:admin');
Route::get('/posts/edit/{id}', [PostController::class, 'edit'])
->middleware('permission:edit posts');
也可组合使用:->middleware(['role:admin', 'permission:publish posts'])
进阶:支持多角色/权限的灵活写法
若不用第三方包,可基于 Eloquent 关系自行实现(如用户-角色-权限三级关联),关键点包括:
- 用户模型中定义
roles()和permissions()关系 - 中间件中用
$user->roles->pluck('name')->contains($role)判断角色 - 权限可合并角色所拥有的全部权限,再用
contains检查 - 为性能考虑,建议用缓存或预加载避免 N+1 查询
不复杂但容易忽略细节,关键是把校验逻辑收口到中间件,保持控制器干净。


















