我正在使用 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');
});
uj5u.com熱心網友回復:
在方法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。也許這也可以應用于您的用例,請在此處查看。希望我已經徹底,它可能會有所幫助。
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/490520.html
