有没有办法在 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\UserApp\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 额外“图像”字段

php 在Laravel Nova资源中覆盖标签

有没有办法在 Laravel 5 验证规则中为输入名称取别名?

测试 Laravel Nova

php 具有自定义访问器的Laravel Nova用户资源

Laravel Nova - 重新加载资源的索引视图