Как разрешить действие nova resource в Политике - PullRequest
1 голос
/ 03 июля 2019

Нова 2.0 Laravel 5.8

У меня есть один ресурс nova Document (содержит URL-адрес файла, связанный внешний ключ и заголовок), для которого я определил policy с create и update false, а все остальные установлены в true, PDF генерируется с другого ресурса, поэтому мне не нужно разрешать его создание или редактирование, теперь все работает нормально, но с другим action на этом ресурсе Document я пытаюсь загрузить эти файлы, выдавая ошибку "Sorry you are not authorized to take this action ", так как разрешить это action на Policy.

DocumentPolicy класс

<?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;
    }
}

1 Ответ

1 голос
/ 06 июля 2019

Причина, по которой вы получаете сообщение об ошибке, заключается в том, что ваш метод update возвращает значение false в вашей политике.

По умолчанию, если обновление имеет значение 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

...