添加功能以启用或禁用用户根据分配的发票使用特定功能

Add functionality to enable or disable user to use specific features on basis of invoice Assigned

我正在做一个项目,我有三种类型的用户 Adminuser1user2。我希望 user1user2 仅当管理员已向他们分配发票时才能够在应用程序中使用某些功能。我尝试使用下面给出的辅助函数。

 $invoice = Invoice::pluck('user_id')->toArray();
    if (Auth::user()->admin == 1 || in_array(Auth::user()->id, $invoice)) {
        return 1;
    } else {
        return 0;
    }

但这不能正常工作。我必须将它放在控制器的每个方法之前,以限制用户使用该功能。还有什么我可以做的吗? 对此有更好的方法吗?

你可以使用 make 一个中间件并传递请求抛出它来检查用户是否被授权这样做。

class SomeMidllewareName
{
    /**
     * Handle an incoming request.
     *
     * @return mixed
     */
    public function handle(Request $request, Closure $next)
    {
        $invoice = Invoice::pluck('user_id')->toArray();
        if (1 == Auth::user()->admin || in_array(Auth::user()->id, $invoice)) {
            return $next($request);
        }

        return \response()->json(['message' => 'you are not authorized'], 401);
    }
}

然后,您可以在路由上进行验证,也可以使用 策略 并单独验证每个功能

您可以使用 middlewares.

使用

创建你的中间件
php artisan make:middleware UserWithInvoiceMiddleware

然后在 app/Http/Middleware/UserWithInvoiceMiddleware.php 中打开您的文件,并将其添加到 handle 方法中:

public function handle($request, Closure $next, ...$guards)
{
    $user = auth()->user();

    $invoice = Invoice::pluck('user_id')->toArray();

    if ($user->admin || in_array($user->id, $invoice)) {
        return $next($request);
    }

    return response()->json(['message' => 'Request not authorized.'], 401);
}

另外,您可以在您的用户模型中创建一个与发票模型的关系:

public function invoice()
{
    return $this->hasOne(Invoice::class);
}

然后,您可以使用此关系简化您的中间件:

public function handle($request, Closure $next, ...$guards)
{
    if (auth()->user()->admin || auth()->user()->has('invoice')) {
        return $next($request);
    }

    return response()->json(['message' => 'Request not authorized.'], 401);
}

您必须在 app/Http/Kernel.php 中的 $routeMiddleware 数组下注册您的中间件:

protected $routeMiddleware = [
 ...
 'user-with-invoice' => App\Http\Middleware\UserWithInvoiceMiddleware::class,
];

然后,您可以使用此中间件保护您的路由,在用户必须是管理员或有发票的路由中添加 ->middleware('user-with-invoice')

Route::get('/example', ExampleController::class)->middleware('user-with-invoice');