2016-07-26 60 views
7

我想用Laravel 5.2开发一个RESTful API。我偶然发现如何以JSON格式返回失败的授权。目前,它正在抛出403页错误而不是JSON。如何在Laravel 5.2中以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); 
    } 
} 

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

+0

我会使用第三方库像野狗/ API。它为你处理这个问题,以及版本控制和变形金刚。 https://github.com/dingo/api – musicvicious

回答

11

我们设法通过修改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); 
} 
+0

这在Laravel中不起作用5.4'dd($ instaceof AuthorizationException)'返回false。 – Rbex

+0

它仍然有效。你的异常真的是AuthorizationException的一个实例吗?也许你忘了使用“use”运算符导入AuthorizationException类? – kremuwa

1

是,使你的政策,将之前的所有其他授权检查执行方法实施前的简单,

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

Akram,在'TenantPolicy.php'中,它会有一些函数,比如'update'和'store',它会有不同的条件语句。那么我应该把什么放在'yourconditiontrue'? –

+0

无论你的授权逻辑是否返回真假,如果是这样的话,那么你必须对每一个相应的功能做条件,让我刷新我对Laravel Policy的了解并回来一个解决方案, –

1

可以拦截例外

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