我在 Laravel 5.8 API 应用程序中添加了 Saptie Laravel Permission Package。一切正常,当非管理员用户尝试访问管理员特定的路由时,我会遇到异常。

但是,默认异常呈现为 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

Controller 方法
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,
    ]);
}

为什么我的自定义消息不显示?

最佳答案

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

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

来自 docs :



应用程序/异常/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);
}

关于php - 自定义 Spatie Laravel-Permission 异常消息,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/57770506/

10-12 00:06
查看更多