如何在策略中允许 nova 资源操作

How to allow nova resource action in Policy

新星2.0 Laravel 5.8

我有一个 nova 资源 Document(包含文件 url、相关的外键和标题),我已经用 create 和 [=14 定义了 policy =] false 和所有其他设置为 true,PDF 是从另一个资源生成的,所以我不需要允许它被创建或编辑,现在一切正常,但是这个文档上有另一个 action资源 我正在尝试下载这些文件,出现错误“Sorry you are not authorized to take this action”,那么如何在 Policy.

上允许此 action

文档策略class

<?php

namespace App\Policies;

use App\User;
use App\Models\Document;
use Illuminate\Auth\Access\HandlesAuthorization;

class DocumentPolicy
{
    use HandlesAuthorization;

    /**
     * Determine whether the user can view any documents.
     *
     * @param  \App\User  $user
     * @return mixed
     */
    public function viewAny(User $user)
    {
        return true;
    }

    /**
     * Determine whether the user can view the document.
     *
     * @param  \App\User  $user
     * @param  \App\Document  $document
     * @return mixed
     */
    public function view(User $user, Document $document)
    {
        return true;
    }

    /**
     * Determine whether the user can create documents.
     *
     * @param  \App\User  $user
     * @return mixed
     */
    public function create(User $user)
    {
        return false;
    }

    /**
     * Determine whether the user can update the document.
     *
     * @param  \App\User  $user
     * @param  \App\Document  $document
     * @return mixed
     */
    public function update(User $user, Document $document)
    {
        return false;
    }

    /**
     * Determine whether the user can delete the document.
     *
     * @param  \App\User  $user
     * @param  \App\Document  $document
     * @return mixed
     */
    public function delete(User $user, Document $document)
    {
        return true;
    }

    /**
     * Determine whether the user can restore the document.
     *
     * @param  \App\User  $user
     * @param  \App\Document  $document
     * @return mixed
     */
    public function restore(User $user, Document $document)
    {
        return true;
    }

    /**
     * Determine whether the user can permanently delete the document.
     *
     * @param  \App\User  $user
     * @param  \App\Document  $document
     * @return mixed
     */
    public function forceDelete(User $user, Document $document)
    {
        return true;
    }

    public function download(User $user, Document $document)
    {
        return true;
    }
}

您收到错误的原因是您的 update 方法 returns 在您的政策中是错误的。

默认情况下,如果更新为false,Nova将不允许该操作。要对此进行测试,您可以尝试将其设置为 true 并再次进行测试。

要解决此问题,您必须更改注册操作的方式以添加自定义回调来处理用户是否可以 运行 操作,如下所示:

public function actions(Request $request)
{
    return [
        (new DownloadDocument)->canRun(function ($request, $document) {
            return $request->user()->can('download', $document);
        }),
    ];
}

这样,它将检查文档策略中的 download 方法,而不是操作的 update 方法。

更多信息:https://nova.laravel.com/docs/2.0/actions/registering-actions.html#authorizing-actions-per-resource