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として返すことは可能ですか?そして、(このコントローラーだけでなく)失敗したすべての承認に対してグローバルにすることは可能ですか?
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);
}
はい、他のすべての承認チェックの前に実行されるポリシーで単純なbeforeメソッドを作成します。
public function before($user, $ability,Request $request)
{
if (!yourconditiontrue) {
if ($request->ajax()) {
return response('Unauthorized.', 401);
} else {
return abort('403');
}
}
}
例外を傍受できます
try {
$this->authorize('update', $data);
} catch (\Exception $e)
{
return response()->json(null, 403);
}