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

Laravel9中Policy设置404响应码仍返回403如何解决

问题原因

该配置不生效的核心原因是对Response::deny()方法的参数理解有误:

  • Laravel 9 中Illuminate\Auth\Access\Response::deny()方法的code参数是业务自定义错误码,并非HTTP响应状态码。方法默认签名如下:
    public static function deny(?string $message = null, int $code = 403)
    
    传入的code: 404只会被写入授权异常的内部错误码字段,框架默认渲染AuthorizationException时固定返回403 HTTP状态码,不会读取该内部code作为HTTP响应状态值。
  • 另一个常见触发点是类引入错误:如果误引入HTTP响应类Illuminate\Http\Response,而非授权逻辑专用的Illuminate\Auth\Access\Response,返回的对象不会被授权解析逻辑识别,会直接走默认403响应逻辑。
正确实现方式

不需要调整路由、控制器代码,仅需修改Policy中的返回逻辑,在deny()调用后链式调用withStatus()方法设置HTTP状态码即可:

// 顶部必须引入正确的授权响应类,不要引入Illuminate\Http\Response
use Illuminate\Auth\Access\Response;

public function viewUser(User $user, User $model)
{
    return $user->id === $model->id
            ? Response::allow()
            : Response::deny()->withStatus(404);
}

如果需要自定义404场景的提示文本,可以给deny()传入第一个字符串参数,例如Response::deny('用户不存在')->withStatus(404),该文本会在异常渲染时作为响应内容返回。

修改后未授权访问时就会正常返回404状态码,符合预期。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 23:42:28