You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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);
}

后续步骤

  1. 在app/Http/Kernel.php中注册你的中间件,比如添加到$routeMiddleware数组:
protected $routeMiddleware = [
    // ...其他中间件
    'post.owner' => \App\Http\Middleware\CheckPostOwner::class,
];
  1. 在需要权限校验的路由上使用该中间件:
Route::get('/posts/{post}/edit', [PostController::class, 'edit'])->middleware('post.owner');
Route::put('/posts/{post}', [PostController::class, 'update'])->middleware('post.owner');

内容的提问来源于stack exchange,提问作者Memonik

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.15 00:15:34