为多个模型创建一个策略?

Posted

技术标签:

【中文标题】为多个模型创建一个策略?【英文标题】:Create one Policy for Multiple Models? 【发布时间】:2018-05-22 11:09:53 【问题描述】:

我正在使用 Laravel-permission 包和权限来处理授权我有一个问题:

我应该向用户添加权限,但我还应该检查用户是否是所有者才能执行该操作,所以我想使用策略,但问题是使用策略时我们应该为我的每个模型和逻辑添加一个策略是一样的,我认为这是非常糟糕的主意。

现在我有多种选择:

1- 创建一个策略,但将其用于多个模型,我不知道如何

2- 创建一个自定义类并创建类似策略的东西

哪个选项更好?

【问题讨论】:

你能显示一些代码吗?在没有看到任何代码的情况下,我建议定义一个自定义中间件:laravel.com/docs/5.6/middleware#defining-middleware 【参考方案1】:

1)you can bind multiple models to the same policy:

protected $policies = [
    Model1::class => WildcardPolicy::class,
    Model2::class => WildcardPolicy::class,
    Model3::class => WildcardPolicy::class,
];

2) 不清楚你的确切目标是什么

【讨论】:

【参考方案2】:

你的问题非常非常好。我也没有解决同样的问题。我认为,您的问题没有用 Policy 方式解决。我认为,政策习惯于在内容与其作者所有者隐私之间。

您可以通过检查中间件层的基于操作/权限的方式来解决。

我推荐的解决方案场景如下;

您可以通过中间件检查登录用户是否访问了 user_roles 表中的当前操作,或者获取所有访问操作列表并存储在登录用户的会话中。

存储的数据可能类似于;

$user = ['accessible_resources' => [
   'product' => ['index','show'],
   'news'    => ['index','show','edit','store','create','update','destroy']
];

希望我的解决方案对你有所帮助。

【讨论】:

【参考方案3】:
.....
use App\Models\Policies\WildcardPolicy;
use Illuminate\Database\Eloquent\Model;
....
class AuthServiceProvider extends ServiceProvider

    /**
     * The policy mappings for the application.
     *
     * @var array
     */
    protected $policies = [
        Model::class => WildcardPolicy::class,
    ];
.....

【讨论】:

您的答案可以通过额外的支持信息得到改进。请edit 添加更多详细信息,例如引用或文档,以便其他人可以确认您的答案是正确的。你可以找到更多关于如何写好答案的信息in the help center。

以上是关于为多个模型创建一个策略?的主要内容,如果未能解决你的问题,请参考以下文章

多个存储桶的 AWS IAM 策略

将多个值传递给核心数据迁移策略函数

设计模式策略模式

帮助在特定模型实例中为用户分配角色的数据库策略

多标签分类策略

无法为名为的类创建映射策略(Cocoa 错误 134110)