【问题标题】:Laravel policies with middleware not working带有中间件的 Laravel 策略不起作用
【发布时间】:2020-10-02 06:54:54
【问题描述】:

我正在 Laravel 中建立一个网站。我试图只允许创建它的用户查看/修改模型。我注册了策略并在路由中使用中间件来限制查看/修改/删除/更新操作,但我总是未经授权

TrashPrivateReportPolicy:


class TrashPrivateReportPolicy
{
    use HandlesAuthorization;

    public function before(User $user){
        if($user->can('manage_all_projects')){
            return true;
        }
    }

    public function results(User $user, TrashPrivateReport $trash_private_report){
        return $user->reports()->map(function($report){$report->trash_report();})->contains($trash_private_report);
    }
}

AuthServiceProvider

class AuthServiceProvider extends ServiceProvider
{
    protected $policies = [
        //'App\Model' => 'App\Policies\ModelPolicy',
        'App\TrashPrivateReport' => 'App\Policies\TrashPrivateReportPolicy',
    ];

  
    public function boot()
    {
        $this->registerPolicies();

        Gate::before(function($user,$ability){
            return $user->abilities()->pluck('name')->contains($ability);
        });

    }
}

路由:web.php

Route::get('/trash_private_reports/results/{trash_private_report}','TrashPrivateReportController@results')->name('trash_private_reports.results')->middleware('can:results,trash_private_report');

因此,当我以 lambda 用户身份连接并希望查看页面结果时
'/trash_private_reports/results/id/' 禁止访问。 该政策似乎没有被调用。我在策略的方法中尝试了 dd(..) 并且没有任何反应。

我已经试过了:

将政策数组更改为:

TrashPrivateReport::class=> TrashPrivateReportPolicy::class

更新和清除:

作曲家转储自动加载

php工匠路线:清除

php 工匠视图:清除

php 工匠配置:清除

感谢您的帮助:)

【问题讨论】:

  • 您的控制器方法是否对模型进行类型提示以允许路由模型绑定?

标签: php laravel laravel-7 laravel-middleware


【解决方案1】:

编辑:

我通过将 before 替换为 after

解决了这个问题
Gate::after(function($user,$ability){
            return $user->abilities()->pluck('name')->contains($ability);
});

【讨论】:

    【解决方案2】:

    这对我有用:

    Route::get('/', [UserController::class, 'index'])->middleware('can:viewAny,' . \App\Models\User::class)
    

    Route::get('/', [UserController::class, 'index'])->middleware('can:viewAny,App\Models\User')
    

    我的模型是App\Models\User。我在 Laravel 8.33.1 上测试过。

    【讨论】:

      【解决方案3】:

      middleware 的第二个参数应该是模型。

      Route::get('/trash_private_reports/results/{trash_private_report}','TrashPrivateReportController@results')->name('trash_private_reports.results')->middleware('can:results,App\TrashPrivateReport');
      

      【讨论】:

      • 似乎不起作用。在此示例中,使用与我相同的语法:laracasts.com/discuss/channels/laravel/…
      • @Anaya 如果你总是在 results 方法中返回 true 怎么办?
      • php public function results(User $user, TrashPrivateReport $trash_private_report){ dd("hello"); return true; } 没有任何反应,dd 没有被触发
      • 该策略似乎从未被调用,我认为它未正确注册或可能未正确与中间件一起使用
      • can 中间件的第二个参数是要使用的路由参数,如果没有与策略一起使用的模型实例,您将使用类名
      猜你喜欢
      • 1970-01-01
      • 2018-07-14
      • 1970-01-01
      • 2019-04-04
      • 2020-10-01
      • 1970-01-01
      • 2013-03-30
      • 2023-04-07
      • 2017-12-26
      相关资源
      最近更新 更多