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)
是的,在您的策略中创建一个简单的 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)
至于Laravel的最新版本,截至目前版本>=7.x,
通常设置请求标头'Accept' => 'application/json'会告诉 Laravel 您期望返回 json 响应。
对于错误,您还需要通过在 .env 文件上设置APP_DEBUG=false来关闭调试,这将确保响应是 json 并且不提供堆栈跟踪。
您可以拦截异常
try {
$this->authorize('update', $data);
} catch (\Exception $e)
{
return response()->json(null, 403);
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
15251 次 |
| 最近记录: |