【问题标题】:Is there a way to explicitly define a policy for a Nova resource in Laravel?有没有办法在 Laravel 中为 Nova 资源显式定义策略?
【发布时间】: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,非常感谢任何帮助。

【问题讨论】:

    标签: laravel laravel-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;
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-02-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多