gpt4 book ai didi

Laravel 限制基于客户/用户/租户的内容

转载 作者:行者123 更新时间:2023-12-04 04:17:30 25 4
gpt4 key购买 nike

我很难找到某种逻辑来限制用户访问同一模型中的内容。例如,供应商只能看到他们供应的产品,而客户只能看到他们购买的产品。 (注:每个产品可以有多个供应商或客户,我们称id为产品节点)

现在,我将关系设置为一个产品属于多个供应商,一个产品属于多个客户。

目前,我在我的站点中拥有 spatie 角色和权限,这对 1 个租户(主要是我们的办公室(50-150 位用户))非常有效。如果我们的办公室用户可以看到多个客户或产品的详细信息,这不是问题,但是当客户登录时问题就开始了。我只想显示属于他们的产品定价或数据。看到任何其他客户或供应商数据是一个很大的禁忌。

我查看了 Multi-Tenancy 实现,但我相信这不能满足我的需要。

如果我遗漏了什么,我深表歉意,但我会尽量保证数据的安全。

能否请您阐明这个难题并指导我走上正确的道路?

非常感谢您的意见!

最佳答案

我假设您要限制的所有模型都与客户直接相关,因此您实际上可以添加一个全局范围,为查询添加一个默认参数。

采用以下范围:

<?php
namespace App\Scopes;

use Illuminate\Database\Eloquent\Builder;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Scope;
use Illuminate\Support\Facades\Auth;

class CustomerOwnedScope implements Scope {
public function apply(Builder $builder, Model $model) {
if (Auth::guard('customer')->check()) {
$builder->where('customer_id', '=', Auth::guard('customer')->id);
}
}

public function extend(Builder $builder) {
$this->addWithoutCustomer($builder);
}

protected function addWithoutCustomer(Builder $builder) {
$builder->macro('withoutCustomer', function (Builder $builder) {
return $builder->withoutGlobalScope($this);
});
}
}

任何具有此范围的模型都会自动添加子句 WHERE customer_id = ? 其中 ? 是当前经过身份验证的客户的 ID(如果已通过身份验证)。假设您使用的是 Laravel 身份验证,这将使您不必做任何特定的事情来实现您的目标。

它还添加了范围 withoutCustomer() 以防止添加 where 子句。

将此添加到属于客户的模型中的最简单方法是为自己创建一个特征(关注点),如下所示:

<?php
namespace App\Concerns;

use App\Scopes\CustomerOwnedScope;

trait OwnedByCustomer {
public static function bootOwnedByCustomer() {
static::addGlobalScope(new CustomerOwnedScope);
}

public function customer() {
$this->belongsTo(Customer::class, 'customer_id');
}
}

这将添加客户关系以及添加范围以根据当前客户自动查询。

您显然可以进一步修改它以包括其他关系,或者您可以添加更多条件以仅适用于设置或未设置特定标志的客户(对于内部用户等)。

整个方法确实假设您的内部管理员用户和外部客户用户使用不同的身份验证守卫(在这种情况下这将是理想的方法)。

我应该补充一点,上面的代码摘 self 写的一篇关于 Multi-Tenancy 主题的文章,特别是关于在单个数据库中处理租户的部分。如果您愿意,可以在这里阅读:https://ollieread.com/articles/laravel-multi-tenancy-avoiding-over-engineering#single-database

关于Laravel 限制基于客户/用户/租户的内容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60356272/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com