为了账号安全,请及时绑定邮箱和手机立即绑定

自定义 Spatie Laravel-Permission 异常消息

自定义 Spatie Laravel-Permission 异常消息

PHP
牧羊人nacy 2021-12-24 15:08:05
我在 Laravel 5.8 API 应用程序中添加了Saptie Laravel 权限包。一切正常,当非管理员用户尝试访问管理员特定路由时,我会遇到异常。但是,默认异常呈现为 HTML 403 User does not have the right roles。考虑到我在 API 应用程序中使用它,我想为此类异常返回我自己的自定义消息。我尝试检查是否auth()->user()->hasRole('admin')仍然获得相同的默认异常页面。这是我的代码路线Route::post('products', 'ProductController@store')->middleware('role:super-admin|admin'); // create a new product控制器方法if (auth()->user()->hasRole('admin')) {    // create & store the product    $product = Product::create($request->all())    // return new product    $responseMessage    = 'Successful operation';    $responseStatus     = 200;    $productResource    = new ProductResource($product);    return response()->json([        'responseMessage'   => $responseMessage,        'responseStatus'    => $responseStatus,        'product'           => $productResource    ]);} else {    return response()->json([        'responseMessage'   => 'You do not have required authorization.',        'responseStatus'    => 403,    ]);}为什么我的自定义消息没有显示?
查看完整描述

1 回答

?
慕码人2483693

TA贡献1860条经验 获得超9个赞

因为您通过role中间件保护您的路由,所以UnauthorizedException在到达您的控制器代码之前将被抛出。


您可以做的是使用 laravel 异常处理程序render方法并检查异常类型并返回您自己的响应:


从文档:


render 方法负责将给定的异常转换为应该发送回浏览器的 HTTP 响应。默认情况下,异常会传递给为您生成响应的基类。但是,您可以自由检查异常类型或返回您自己的自定义响应


应用程序/异常/Handler.php


use Spatie\Permission\Exceptions\UnauthorizedException;


public function render($request, Exception $exception)

{

    if ($exception instanceof UnauthorizedException) {

        return response()->json([

            'responseMessage' => 'You do not have required authorization.',

            'responseStatus'  => 403,

        ]);

    }


    return parent::render($request, $exception);

}


查看完整回答
反对 回复 2021-12-24
  • 1 回答
  • 0 关注
  • 237 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信