有没有办法在 Laravel 中为 Nova 资源显式定义策略?
Posted
技术标签:
【中文标题】有没有办法在 Laravel 中为 Nova 资源显式定义策略?【英文标题】:Is there a way to explicitly define a policy for a Nova resource in Laravel? 【发布时间】:2020-11-25 16:33:02 【问题描述】:场景是我希望能够独立于其他用户来管理员工用户类型。只有员工才能看到员工资源并与之交互,其他用户类型不得访问它。
所以我有App\Nova\User
和App\Nova\Staff
资源,它们的$model
属性指向App\Models\User
模型。这很好用,可以完成我需要做的所有事情。
我现在遇到的问题是权限问题。我也在一些地方使用了 Laravel 的策略,并且想在这里做同样的事情,但是我不知道如何专门为 Staff 资源制定策略,因为它引用了 User 模型? 我基本上不希望非员工用户能够查看任何内容,或对员工执行任何 CRUD 操作。我相信我可以从侧边栏中隐藏员工,但我的理解是用户仍然可以通过 URL 访问它。
我知道我可以创建一个扩展 User 模型的 Staff 模型,然后我的 Nova 资源可以指向那个新的 Staff 模型,但我遇到了问题,因为在使用 @987654325 之前,我最初是这样设置它的@ 用于用户角色/权限。
我还想为其他一些用户类型创建资源,以便可以独立管理它们,即使它们都在同一个用户表中。我最终会得到像员工这样的超级管理员,另一种用户类型的客户管理员可以看到他们客户中的所有用户,所以他们可能会看到“员工”资源,就像上面一样,只有客户管理员应该能够看到这一点,当然也只能在其中看到自己的员工。
这是我第一次使用 Nova,非常感谢任何帮助。
【问题讨论】:
【参考方案1】:根据 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 ,它将起作用。
【讨论】:
【参考方案2】:@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;
【讨论】:
以上是关于有没有办法在 Laravel 中为 Nova 资源显式定义策略?的主要内容,如果未能解决你的问题,请参考以下文章
没有实际数据库列的表单上的 Laravel Nova 额外“图像”字段