gpt4 book ai didi

Laravel 5.3 在策略失败时传递 AuthorizationException 消息

转载 作者:行者123 更新时间:2023-12-01 13:40:20 24 4
gpt4 key购买 nike

我正试图找到一种干净的方法来覆盖 AuthorizationException 以获取一个动态字符串,该字符串可以在 Policy 失败时传回。

我知道我能做的是:

  1. 用 try-catch 将 Controller 中的 Policy 包装起来,然后重新抛出一个接受特定字符串的自定义异常,这看起来有点冗长

  2. abort(403, '...') 在返回之前在 Policy 中,这看起来有点老套,因为政策已经在起作用了

然后在 /Exceptions/Handler::render 中,我可以将响应作为 JSON 发回

是否有更好的方法来执行此操作以在策略失败的响应中获取消息?或者 1 或 2 个是我的最佳选择。

最佳答案

我注意到如果你在一个使用 Laravel 异常的策略中 throw AuthorizationException($message) 它会让你跳出策略,但继续在 Controller 中执行,并且不会进展到 处理程序::呈现。我假设这是他们以某种方式处理异常,但我找不到他们在哪里做的......所以如果有人发现这是在哪里发生的,我仍然想知道。

如果您创建自己的 AuthorizationException 并抛出它,它将按预期停止执行,并掉入 Handler::render 所以我最终将此方法添加到我的政策:

use App\Exceptions\AuthorizationException;

// ... removed for brevity

private function throwExceptionIfNotPermitted(bool $hasPermission = false, bool $allowExceptions = false, $exceptionMessage = null): bool
{
// Only throw when a message is provided, or use the default
// behaviour provided by policies
if (!$hasPermission && $allowExceptions && !is_null($exceptionMessage)) {

throw new \App\Exceptions\AuthorizationException($exceptionMessage);
}

return $hasPermission;
}

仅在 \App\Exceptions 中抛出策略的新异常:

namespace App\Exceptions;

use Exception;

/**
* The AuthorizationException class is used by policies where authorization has
* failed, and a message is required to indicate the type of failure.
* ---
* NOTE: For consistency and clarity with the framework the exception was named
* for the similarly named exception provided by Laravel that does not stop
* execution when thrown in a policy due to internal handling of the
* exception.
*/
class AuthorizationException extends Exception
{
private $statusCode = 403;

public function __construct($message = null, \Exception $previous = null, $code = 0)
{
parent::__construct($message, $code, $previous);
}

public function getStatusCode()
{
return $this->statusCode;
}
}

处理异常并在 Handler::render() 中的 JSON 响应中提供消息:

public function render($request, Exception $exception)
{
if ($exception instanceof AuthorizationException && $request->expectsJson()) {

return response()->json([
'message' => $exception->getMessage()
], $exception->getStatusCode());
}

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

而且我还从 Handler::report 中删除了它。

关于Laravel 5.3 在策略失败时传递 AuthorizationException 消息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40873709/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com