Php 中间件不起作用的Laravel策略
我正在拉维尔建立一个网站。我试图只允许创建模型的用户查看/修改模型。我注册了策略并在路由中使用中间件来限制查看/修改/删除/更新操作,但我总是未经授权 TrashPrivateReportPolicy:Php 中间件不起作用的Laravel策略,php,laravel,laravel-7,laravel-middleware,Php,Laravel,Laravel 7,Laravel Middleware,我正在拉维尔建立一个网站。我试图只允许创建模型的用户查看/修改模型。我注册了策略并在路由中使用中间件来限制查看/修改/删除/更新操作,但我总是未经授权 TrashPrivateReportPolicy: 类TrashPrivatePortPolicy { 使用免提授权; 之前的公共函数(用户$User){ 如果($user->can('manage_all_projects')){ 返回true; } } 公共功能结果(用户$User,垃圾桶私人报告$trash\u private\u报告){
类TrashPrivatePortPolicy
{
使用免提授权;
之前的公共函数(用户$User){
如果($user->can('manage_all_projects')){
返回true;
}
}
公共功能结果(用户$User,垃圾桶私人报告$trash\u private\u报告){
返回$user->reports()->map(函数($report){$report->trash_report();})->包含($trash_private_report);
}
}
AuthServiceProvider
类AuthServiceProvider扩展了ServiceProvider
{
受保护的$policies=[
//'App\Model'=>'App\Policies\ModelPolicy',
“App\TrashPrivateReport”=>“App\Policys\TrashPrivateReportPolicy”,
];
公共函数boot()
{
$this->registerPolicys();
Gate::before(函数($user,$ability){
返回$user->abilities()->pull('name')->contains($ability);
});
}
}
路由:web.php
Route::get('/trash\u private\u reports/results/{trash\u private\u report}','TrashPrivateReportController@results')->name('trash_private_reports.results')->中间件('can:results,trash_private_report');
因此,当我作为lambda用户连接并希望查看页面结果时“/trash\u private\u reports/results/id/”访问被禁止。 这项政策似乎没有被称为。我尝试了dd(…)的策略方法,但什么都没有发生 我已经试过了: 将策略数组更改为: TrashPrivatePort::class=>TrashPrivatePortPolicy::class 更新和清除: 作曲家转储自动加载 php artisan路由:清除 php artisan视图:清除 php artisan配置:清除
谢谢您的帮助:)中间件的第二个参数应该是模型
Route::get('/trash\u private\u reports/results/{trash\u private\u report}','TrashPrivateReportController@results')->name('trash_private_reports.results')->中间件('can:results,App\TrashPrivateReport');
编辑:
我通过将之前的替换为之后的解决了这个问题
Gate::after(函数($user$ability){
返回$user->abilities()->pull('name')->contains($ability);
});
这对我很有用:
Route::get('/', [UserController::class, 'index'])->middleware('can:viewAny,' . \App\Models\User::class)
或
我的模型是
App\models\User
。我在Laravel 8.33.1上进行了测试。似乎不起作用。在这个例子中,使用了与我相同的语法:@Anaya如果你总是在results
方法中返回true
,php公共函数结果(User$User,trashprivate\u report$trash\u private\u report){dd(“hello”);return true;}
什么都没有发生,dd未触发Edit似乎从未调用过策略,我认为它未正确注册或可能未与中间件一起正确使用can
中间件的第二个参数是要使用的路由参数,如果没有模型实例与策略一起使用,您将使用类名控制器方法类型是否暗示模型允许路由模型绑定?
Route::get('/', [UserController::class, 'index'])->middleware('can:viewAny,App\Models\User')