【问题标题】:Add functionality to enable or disable user to use specific features on basis of invoice Assigned添加功能以启用或禁用用户根据分配的发票使用特定功能
【发布时间】:2021-04-19 17:42:59
【问题描述】:

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

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

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

【问题讨论】:

  • 定义用户表和发票表的关系。
  • hasOne() 关系适用于此吗?
  • 技术上是的,因为即使连接了一张发票,您的用例似乎也已授权。

标签: php laravel eloquent middleware laravel-8


【解决方案1】:

您可以使用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');

【讨论】:

  • 我可以使用这个中间件来隐藏刀片文件中的某些内容,例如指向某些功能的链接吗?
  • 可以使用中间件保护链接不被访问,但不能仅使用中间件隐藏链接。
  • 非常感谢
【解决方案2】:

您可以使用制作中间件并通过请求将其抛出以检查用户是否有权这样做。

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);
    }
}

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-10-17
    • 1970-01-01
    • 1970-01-01
    • 2011-03-17
    • 2011-07-29
    • 1970-01-01
    • 2023-03-23
    • 1970-01-01
    相关资源
    最近更新 更多