场景是我希望能够独立于其他用户管理员工用户类型。只有员工应该能够查看员工资源并与之交互,其他用户类型都不应有权访问它。
所以我有
App\Nova\User
和 App\Nova\Staff
资源,并且这两个资源都有指向 $model
模型的 App\Models\User
属性。这效果很好,可以完成我需要它做的一切。
我现在遇到的问题是权限。我还在一些地方使用了 Laravel 的策略,并且想在这里做同样的事情,但我不知道如何专门为 Staff 资源制定策略,因为它引用了 User 模型? 我基本上不希望非工作人员用户能够查看任何工作人员或对工作人员执行任何 CRUD 操作。我相信我可以从侧边栏隐藏工作人员,但我的理解是用户仍然可以通过 URL 访问它。
我知道我可以创建一个扩展用户模型的 Staff 模型,然后我的 Nova 资源可以指向该新的 Staff 模型,但我对此有问题,因为这就是我最初设置它的方式,然后使用
spatie/laravel-permissions
进行用户角色/权限。
我还想为其创建一些其他用户类型的资源,以便可以独立管理它们,即使它们都位于同一个用户表中。我最终会发现员工是一种超级管理员,而另一种用户类型的客户管理员可以看到其客户中的所有用户,因此他们可能会看到“员工”资源,就像上面一样,只有客户管理员才应该能够看到它,而且当然只能看到他们自己的员工。
这是我第一次使用 Nova,因此非常感谢任何帮助。
根据 nova 文档,您只能将策略应用于模型,并且当每个资源都指向其自己的模型时,它可以完美地工作。
但是在您的情况下,App\Nova\User 和 App\Nova\Staff 资源,这两个资源的 $model 属性都指向 App\Models\User 模型。
所以,这是解决方案,您可以做的是为 App\Nova\Staff 创建一个单独的模型,即 App\Models\Staff 并扩展 App\Nova\User 模型。
class Staff extends User{ }
现在 App\Nova\Staff 资源应该指向 App\Models\Stuff 模型。
此时如果您将策略应用到 App\Models\Staff ,它将起作用。
@Nathan,您可以使用特定的身份验证防护来验证不同的模型。
之后,您可以在策略中为用户编写不同的逻辑。
/**
* Determine whether the user can update the model.
*
* @param Model $user
* @param \App\Document $document
* @return mixed
*/
public function update(Model $user, Document $document)
{
return $user instanceof User ? true : false;
}
我通过向策略添加私有方法并接受策略方法上的 Elequent 模型来解决这个问题:
public function viewAny(Model $user): bool
{
if($this->isAdmin($user)) {
return true;
};
return false;
}
private function isAdmin(Model $user)
{
if($user instanceof AdminUser) {
return true;
}
if ($user instanceof User) {
return false;
}
throw new \Exception('User type not supported');
}