首页 > 解决方案 > Laravel/Bouncer 在门口检查所有权

问题描述

我是保镖新手,我想使用中间件验证所有权。ownVia 闭包确实运行,但即使我强制它返回 false,当我请求路由时也会返回 Report 模型。我错过了什么?

AppServiceProvider@boot

Bouncer::ownedVia(Report::class, function ($report, $user) {
    Log::info('Closure ran!');
    return $report->hub->user_id === $user->id;
});

路线

Route::get('report/{report}', 'ReportController@get')->middleware('can:view-report,report');

报告控制器

public function __construct()
{
    $this->authorizeResource(Report::class);
}

public function get(Report $report)
{
    return new ReportResource($report);
}

用户服务

Bouncer::allow($user)->toOwn(Report::class);

用户

class User extends Authenticatable
{
    use Notifiable, HasApiTokens, HasRolesAndAbilities;

标签: laravel

解决方案


您确定用户没有其他允许这样做的能力吗?

试试这个:

  1. 从路由中删除中间件。

  2. 删除构造函数中的调用authorizeResource

  3. 然后,在您的get方法的顶部,添加以下内容:

    dd(\Gate::authorize('view', $report));
    

应该记录允许该操作的实际能力。


推荐阅读