我用的是Laravel 9
我希望阻止用户查看其他用户的个人信息。这是我的政策方法
public function viewUser(User $user, User $model)
{
return $user->id === $model->id;
}这是控制器方法
public function show(User $user)
{
$this->authorize('viewUser', $user);
return view('users.show', compact('user'));
}如预期所示为403
但我想将状态代码更改为404,如下所示
public function viewUser(User $user, User $model)
{
return $user->id === $model->id
? Response::allow()
: Response::deny(code: 404);
}它仍然显示403,而不是404。我的政策怎么了?我知道我可以用另一种方法来改变我的反应,但是我关于Laravel政策本身的问题。
路由
Route::group([
'middleware' => ['auth'],
'prefix' => 'users/{user}',
'as' => 'users.',
], function () {
Route::get('/', [UserController::class, 'show'])->name('show');
});发布于 2022-06-13 12:03:22
在app\Exceptions\Handler.php中的render()方法中,您可以定义抛出X异常时应该做什么。话虽如此,添加下面的代码应该对您有好处:
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。也许这也可以应用到您的用例中,请检查一下这里。希望我做得很彻底,也许能帮上忙。
发布于 2022-07-20 14:09:52
由于Laravel9.20可以用denyAsNotFound方法实现--链接到文档
public function viewUser(User $user, User $model)
{
return $user->id === $model->id ?
$this->allow() :
$this->denyAsNotFound();
}或者使用denyWithStatus()更通用的方式
public function viewUser(User $user, User $model)
{
return $user->id === $model->id ?
$this->allow() :
$this->denyWithStatus(404);
}https://stackoverflow.com/questions/72602292
复制相似问题