Laravel中间件问题:如何限制用户仅能编辑自己的文章
问题分析与解决方案
你的代码问题在于:$matches = Post::where('user_id', auth()->user()->id); 返回的是Laravel查询构造器对象,而非实际的查询结果。所以!$matches永远为false,根本不会触发403错误。
要实现用户仅能编辑自己的文章,你需要验证当前请求的具体文章是否属于当前用户,而不是查询用户的所有文章集合。
正确的中间件实现
方式1:利用路由模型绑定(推荐)
如果你的路由定义是类似/posts/{post}/edit这种带模型参数的形式,Laravel会自动将{post}参数解析为对应的Post模型实例,直接用这个实例做权限校验即可:
public function handle(Request $request, Closure $next) { // 从路由中获取自动注入的Post模型 $post = $request->route('post'); // 检查文章是否存在,且归属当前用户 if (!$post || $post->user_id !== auth()->user()->id) { abort(403, '你无权编辑这篇文章'); } return $next($request); }
方式2:手动查询验证
如果没有使用路由模型绑定,先从路由参数中获取文章ID,再查询验证:
public function handle(Request $request, Closure $next) { // 获取路由中的文章ID参数 $postId = $request->route('post'); // 直接查询该文章是否属于当前用户 $isOwner = Post::where('id', $postId) ->where('user_id', auth()->user()->id) ->exists(); if (!$isOwner) { abort(403); } return $next($request); }
后续步骤
- 在
app/Http/Kernel.php中注册你的中间件,比如添加到$routeMiddleware数组:
protected $routeMiddleware = [ // ...其他中间件 'post.owner' => \App\Http\Middleware\CheckPostOwner::class, ];
- 在需要权限校验的路由上使用该中间件:
Route::get('/posts/{post}/edit', [PostController::class, 'edit'])->middleware('post.owner'); Route::put('/posts/{post}', [PostController::class, 'update'])->middleware('post.owner');
内容的提问来源于stack exchange,提问作者Memonik
相关产品推荐
相关产品推荐

