web-dev-qa-db-ja.com

403応答をJSON形式でLaravel 5.2?

Laravel 5.2でRESTful APIを開発しようとしています。JSON形式で失敗した認証を返す方法につまずいています。現在、JSONではなく403ページエラーをスローしています。

コントローラー: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);
    }
}

現在、認証は正常に機能していますが、jsonエラーを返す代わりに403禁止ページが表示されています。 403のJSONとして返すことは可能ですか?そして、(このコントローラーだけでなく)失敗したすべての承認に対してグローバルにすることは可能ですか?

15
Heru S

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);
}
23
Heru S

はい、他のすべての承認チェックの前に実行されるポリシーで単純なbeforeメソッドを作成します。

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

例外を傍受できます

    try {
        $this->authorize('update', $data);
    } catch (\Exception $e)
    {
        return response()->json(null, 403);
    }
2
120DEV