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

Her*_*u S 16 php laravel-5 laravel-5.2

我正在尝试使用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;
    }
}
Run Code Online (Sandbox Code Playgroud)

政策: TenantPolicy.php

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

授权目前工作正常,但它显示403禁止页面而不是返回json错误.是否可以将其作为403的JSON返回?而且,是否有可能使所有失败的授权(不仅仅是在这个控制器中)全局化?

Her*_*u S 24

我们设法通过修改在函数中App\Exceptions\Handler.php添加它时发现的异常处理程序来解决这个问题render.

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

  • 它仍然有效。你的异常真的是 AuthorizationException 的一个实例吗?也许您忘记使用“use”运算符导入 AuthorizationException 类? (4认同)

Akr*_*hid 6

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

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


Iru*_*ika 6

至于Laravel的最新版本,截至目前版本>=7.x,

通常设置请求标头'Accept' => 'application/json'会告诉 Laravel 您期望返回 json 响应。

对于错误,您还需要通过在 .env 文件上设置APP_DEBUG=false来关闭调试,这将确保响应是 json 并且不提供堆栈跟踪。


120*_*DEV 5

您可以拦截异常

    try {
        $this->authorize('update', $data);
    } catch (\Exception $e)
    {
        return response()->json(null, 403);
    }
Run Code Online (Sandbox Code Playgroud)