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
相关产品推荐
相关产品推荐

