如何在策略中允许 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
新星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