如何在Laravel 5.2中以JSON格式返回403响应?

2022-08-30 15:12:05

我正在尝试使用Laravel 5.2开发一个RESTful API。我偶然发现了如何以JSON格式返回失败的授权。目前,它正在抛出403页面错误而不是JSON。

控制器:TenantController.php

class TenantController extends Controller
{
    public function show($id)
    {
        $tenant = Tenant::find($id);
        if($tenant == null) return response()->json(['error' => "Invalid tenant ID."],400);
        $this->authorize('show',$tenant);
        return $tenant;
    }
}

政策:TenantPolicy.php

class TenantPolicy
{
    use HandlesAuthorization;
    public function show(User $user, Tenant $tenant)
    {
        $users = $tenant->users();
        return $tenant->users->contains($user->id);
    }
}

授权当前工作正常,但它显示的是 403 禁止访问页面,而不是返回 json 错误。是否可以将其作为 403 的 JSON 返回?而且,是否有可能将其设置为所有失败的授权的全局(而不仅仅是在此控制器中)?


答案 1

我们通过修改在函数中添加异常处理程序来设法解决此问题。App\Exceptions\Handler.phprender

public function render($request, Exception $e)
{
    if ($e instanceof AuthorizationException)
    {
        return response()->json(['error' => 'Not authorized.'],403);
    }
    return parent::render($request, $e);
}

答案 2

是的,在您的策略中创建一个简单的 before 方法,该方法将在所有其他授权检查之前执行,

public function before($user, $ability,Request $request)
{
    if (!yourconditiontrue) {
         if ($request->ajax()) {
            return response('Unauthorized.', 401);
        } else {
            return abort('403');
        }
    }
}

推荐