我已经为api端点创建了一个资源控制器。我还为该模型创建了相应的策略。
如果我使用
进行按方法授权检查 $this->authorize('delete', $asset);
然后它可以按预期工作,但是如果我将以下内容添加到构造中,那么我总是会被禁止使用403。
不确定我要缺少什么,因为这应将授权应用于所有方法。
$this->authorizeResource(Asset::class,'asset');
这就是我的路线
Route::group(['middleware' => ['auth:api']], function () {
Route::Resource('asset','AssetsApiController');
});
我的保单是这样注册的
protected $policies = [
Asset::class => AssetPolicy::class,
];
我删除的政策方法是
public function delete(User $user, Asset $asset)
{
return true;
}
API控制器的构造函数是
public function __construct()
{
$this->authorizeResource(Asset::class,'asset');
}
API控制器方法是
public function destroy($assetID)
{
$asset = Asset::findOrFail($assetID);
$asset->delete();
}
我的路线列表是
| | GET|HEAD | api/asset | asset.index | App\Http\Controllers\AssetsApiController@index | api,auth:api |
| | POST | api/asset | asset.store | App\Http\Controllers\AssetsApiController@store | api,auth:api,can:create,App\Asset |
| | GET|HEAD | api/asset/create | asset.create | App\Http\Controllers\AssetsApiController@create | api,auth:api,can:create,App\Asset |
| | PUT|PATCH | api/asset/{asset} | asset.update | App\Http\Controllers\AssetsApiController@update | api,auth:api,can:update,asset |
| | DELETE | api/asset/{asset} | asset.destroy | App\Http\Controllers\AssetsApiController@destroy | api,auth:api,can:delete,asset |
| | GET|HEAD | api/asset/{asset} | asset.show | App\Http\Controllers\AssetsApiController@show | api,auth:api,can:view,asset |
| | GET|HEAD | api/asset/{asset}/edit | asset.edit | App\Http\Controllers\AssetsApiController@edit | api,auth:api,can:update,asset |
| | GET|HEAD | assets | | App\Http\Controllers\AssetsController@index | web
我想我丢失了一些东西,但我看不到,因为望远镜显示该门被拒绝了。唯一奇怪的是,serveNova中间件似乎是被拒绝的来源
Time 2019年5月8日,10:51:37 AM(1400万年前) 主机名核心 能力删除 结果被拒绝 位置/home/vagrant/code/nova/src/Http/Middleware/ServeNova.php:25 请求查看请求 标签Auth:1
答案 0 :(得分:1)
我已经在https://github.com/laravel/framework/issues/22847#issuecomment-521308861处描述了我的课程,学习了这个累人的问题。也许有人会觉得有用。
答案 1 :(得分:0)
我遇到了同样的问题,并通过更改控制器方法的签名解决了该问题。
默认情况下,控制器接收一个整数$id
来引用模型,而策略则直接接收模型实例。我的直觉是无法在控制器和策略之间进行映射。
因此,我建议尝试将控制器方法更改为:
public function destroy(Asset $asset)
{
$asset->delete();
}
我不知道这是一个错误吗?我没有找到有关这些方法类型签名约定的文档。
答案 2 :(得分:0)
我发现正确获取AuthorizeResource的Model标识符参数非常麻烦。当参数丢失或传递不正确时,策略之前的步骤将引发错误(不是请求策略本身,因为请求永远不会发送给策略)。就我而言,这意味着我的CheckUserActive中间件引发了错误,即使该错误是在Controller的Construct函数中(而不是中间件)。有关AuthorizeResource寻找的参数的一些注意事项:
例如:
$this->authorizeResource(Model::class, 'parameter');
答案 3 :(得分:0)
我通过删除第二个参数解决了这个问题:
public function __construct()
{
$this->authorizeResource(Admin::class);
}