可以在Request类中授权方法为HandlesAuthorization特性返回自定义消息吗?

时间:2017-09-29 19:07:33

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

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

默认情况下,

HandlesAuthorization trait会显示默认消息。有没有办法返回自定义消息?我看到Request class中的授权方法只能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);
    }

}

2 个答案:

答案 0 :(得分:5)

我相信你不应该看HandlesAuthorization特质。您需要做的就是在请求类中实现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.');
}

答案 1 :(得分:1)

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

这是一个只有一个条件的例子,它会导致非标准消息: private bool $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();
}