首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何更改Laravel响应状态代码?

如何更改Laravel响应状态代码?
EN

Stack Overflow用户
提问于 2022-06-13 11:47:26
回答 2查看 288关注 0票数 1

我用的是Laravel 9

我希望阻止用户查看其他用户的个人信息。这是我的政策方法

代码语言:javascript
运行
复制
public function viewUser(User $user, User $model)
{
    return $user->id === $model->id;
}

这是控制器方法

代码语言:javascript
运行
复制
public function show(User $user)
{
    $this->authorize('viewUser', $user);
    return view('users.show', compact('user'));
}

如预期所示为403

但我想将状态代码更改为404,如下所示

代码语言:javascript
运行
复制
public function viewUser(User $user, User $model)
{
    return $user->id === $model->id
            ? Response::allow()
            : Response::deny(code: 404);
}

它仍然显示403,而不是404。我的政策怎么了?我知道我可以用另一种方法来改变我的反应,但是我关于Laravel政策本身的问题。

路由

代码语言:javascript
运行
复制
Route::group([
    'middleware' => ['auth'],
    'prefix' => 'users/{user}',
    'as' => 'users.',
], function () {
    Route::get('/', [UserController::class, 'show'])->name('show');
});
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2022-06-13 12:03:22

app\Exceptions\Handler.php中的render()方法中,您可以定义抛出X异常时应该做什么。话虽如此,添加下面的代码应该对您有好处:

代码语言:javascript
运行
复制
if ($exception instanceof AuthorizationException) {
    $exception = new NotFoundHttpException;
}

return parent::render($request, $exception);

它所做的基本上是检查抛出的异常是否是AuthorizationException ( Laravel抛出的策略),如果是这样的话,抛出一个新的NotFoundHttpException (404)。然而,这将将任何和所有的AuthorizationExceptions更改为404,这可能是不需要的行为。

更新:

在挖掘之后,我发现了一个已结束的返回404的建议

就我个人而言,我觉得政策只应该返回403状态代码,因为这是正确的代码,所以是禁止的。返回404是不正确的,因为策略不处理未找到的X资源。

如果你真的想要的话,你可以改变Handler.php。然而,我觉得这并不是正确的政策使用方式,但这并不是重点所在。

上述封闭建议中的用户使用请求参数来检查路由是否属于某种类型,即产品,并返回404而不是403。也许这也可以应用到您的用例中,请检查一下这里。希望我做得很彻底,也许能帮上忙。

票数 2
EN

Stack Overflow用户

发布于 2022-07-20 14:09:52

由于Laravel9.20可以用denyAsNotFound方法实现--链接到文档

代码语言:javascript
运行
复制
public function viewUser(User $user, User $model)
{
     return $user->id === $model->id ?
            $this->allow() :
            $this->denyAsNotFound();
}

或者使用denyWithStatus()更通用的方式

代码语言:javascript
运行
复制
public function viewUser(User $user, User $model)
{
     return $user->id === $model->id ?
            $this->allow() :
            $this->denyWithStatus(404);
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72602292

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档