【问题标题】:Can authorize method in Request class return customized message for HandlesAuthorization trait?Request 类中的授权方法可以返回 HandlesAuthorization 特征的自定义消息吗?
【发布时间】:2018-03-11 18:02:15
【问题描述】:

我在 Request 类中有以下代码来检查用户是否有权执行更新。

HandlesAuthorization trait,默认给出默认消息。有没有办法返回自定义消息?我看到Request class中的authorize方法只能return boolean值。

class UpdateRoleRequest extends Request
{
    private $UserPermissionsSession;

    public function __construct(IRole $Role) {
        $this->UserPermissionsSession = new UserPermissionsSession();
    }

    public function authorize() {
        $UserID = \Auth::user()->UserID;
        return $this->UserPermissionsSession->CheckPermissionExists($UserID);
    }

}

【问题讨论】:

  • 您可以根据要求实现 failedAuthorization 方法

标签: laravel laravel-5 laravel-5.5 laravel-authorization laravel-request


【解决方案1】:

我相信你不应该看HandlesAuthorization trait。您需要做的就是在您的请求类中实现failedAuthorization 方法。

在FormRequest 类中定义如下:

/**
 * Handle a failed authorization attempt.
 *
 * @return void
 *
 * @throws \Illuminate\Auth\Access\AuthorizationException
 */
protected function failedAuthorization()
{
    throw new AuthorizationException('This action is unauthorized.');
}

因此,您只需在 UpdateRoleRequest 类中覆盖此方法,例如:

protected function failedAuthorization()
{
    throw new \Illuminate\Auth\Access\AuthorizationException('User has to be an admin.');
}

【讨论】:

  • 非常感谢,但如果我只想在一种情况下使用此自定义消息怎么办?我只想在条件为真时发送该自定义消息,否则我想要另一个与用户是管理员无关的检查,并且在这种情况下我想要默认消息。
  • 谢谢你,但不幸的是有人删除了你的答案,并借此机会使这个页面变得更好......
【解决方案2】:

为其他想知道相同问题的人提供回答@Pooria Honarmand 问题的解决方案;
如果您已经在 authorize 方法中检查了针对不同条件的更具体的消息,并且您不想在此处重复这些检查,只需引入一个或多个基于类的变量。

这是一个示例,它只有一个条件会导致非标准消息: 私人布尔 $hasMissingClientId = false;

public function authorize(): bool
{
    // several other checks

    if (empty($user->client_id)) {
        $this->hasMissingClientId = true;
        return false;
    }
    return true;
}

protected function failedAuthorization()
{
    if ($this->hasMissingClientId) {
        throw new AuthorizationException('User has to be assigned to specific client.');
    }
    parent::failedAuthorization();
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-27
    • 2015-05-12
    • 2017-07-19
    • 2019-10-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多