Laravel 政策总是 return 错误
Laravel policies always return false
我已创建策略,并添加方法视图:
public function view(User $user, Contact $contact)
{
return $user->id === $contact->manager;
}
那我注册了:
protected $policies = [
'App\Model' => 'App\Policies\ModelPolicy',
Contact::class => ContactPolicy::class,
];
然后我尝试将它与控制器助手一起使用:
public function view($id)
{
$contact = Contact::find($id);
$user = Auth::user();
$this->authorize('view', $contact);
return view('contact.edit')->with('contact', $contact);
}
和中间件:
Route::get('/contact/edit/{id}', 'EditContactController@view')->middleware('can:view,contact');
但我总是收到 403 错误。
contact->manager 和 user->id 是一样的。
另外,联系 table 计划:
CREATE TABLE `contacts` (
`id` int(11) NOT NULL,
`first_name` varchar(25) NOT NULL,
`last_name` varchar(25) NOT NULL,
`email` varchar(35) NOT NULL,
`home_phone` int(10) DEFAULT NULL,
`work_phone` int(10) DEFAULT NULL,
`cell_phone` int(10) DEFAULT NULL,
`best_phone` enum('home_phone','work_phone','cell_phone') NOT NULL,
`address_1` varchar(100) DEFAULT NULL,
`address_2` varchar(100) DEFAULT NULL,
`city` varchar(35) DEFAULT NULL,
`state` varchar(35) DEFAULT NULL,
`zip` int(6) DEFAULT NULL,
`country` varchar(35) DEFAULT NULL,
`birth_date` date DEFAULT NULL,
`manager` int(11) UNSIGNED NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
我刚刚更换了
protected $policies = [
'App\Model' => 'App\Policies\ModelPolicy',
Contact::class => ContactPolicy::class,
];
和
protected $policies = [
'App\Model' => 'App\Policies\ModelPolicy',
'App\Contact' => 'App\Policies\ContactPolicy',
];
现在它可以与 $this->authorize('view', $contact);
一起使用,但中间件仍然 return 403
如果它有你的中间件,请检查你的路由 link 如果它有你的中间件,你可以设置它。
Route::get('/view', CONTROLLER@view)->middleware('YOUR-MIDDLEWARE');
示例:
Route::get('/view', UserController@view)->middleware('auth:user');
我知道这是一个老问题,但如果其他人遇到这个问题,请确保查看控制器以确定是否在函数调用中声明了模型
楼主的代码应该是
EditController.php
public function view(Contact $contact)
和web.php
Route::get('/contact/edit/{contact}', 'EditContactController@view')->middleware('can:view,contact');
这样依赖注入才能正常工作
如果您将模型翻译成您的语言,您可以检查复数形式。
让我解释一下:
示例:模型 Pagamento
Url 鼻涕虫:pagamenti
在我的例子中,在函数内部使用检查工作正常,但使用构造函数无效:
public function edit(Pagamento $pagamenti)
{
$this->authorize('update', $pagamenti);
//..
我改了:
public function __construct()
{
//Abilita su tutto il resource
//$this->authorizeResource(Pagamento::class,'pagamento'); // Not Works
$this->authorizeResource(Pagamento::class,'pagamenti'); // Works
}
现在工作正常 ;)
希望能帮到你 ;)
我已创建策略,并添加方法视图:
public function view(User $user, Contact $contact)
{
return $user->id === $contact->manager;
}
那我注册了:
protected $policies = [
'App\Model' => 'App\Policies\ModelPolicy',
Contact::class => ContactPolicy::class,
];
然后我尝试将它与控制器助手一起使用:
public function view($id)
{
$contact = Contact::find($id);
$user = Auth::user();
$this->authorize('view', $contact);
return view('contact.edit')->with('contact', $contact);
}
和中间件:
Route::get('/contact/edit/{id}', 'EditContactController@view')->middleware('can:view,contact');
但我总是收到 403 错误。 contact->manager 和 user->id 是一样的。 另外,联系 table 计划:
CREATE TABLE `contacts` (
`id` int(11) NOT NULL,
`first_name` varchar(25) NOT NULL,
`last_name` varchar(25) NOT NULL,
`email` varchar(35) NOT NULL,
`home_phone` int(10) DEFAULT NULL,
`work_phone` int(10) DEFAULT NULL,
`cell_phone` int(10) DEFAULT NULL,
`best_phone` enum('home_phone','work_phone','cell_phone') NOT NULL,
`address_1` varchar(100) DEFAULT NULL,
`address_2` varchar(100) DEFAULT NULL,
`city` varchar(35) DEFAULT NULL,
`state` varchar(35) DEFAULT NULL,
`zip` int(6) DEFAULT NULL,
`country` varchar(35) DEFAULT NULL,
`birth_date` date DEFAULT NULL,
`manager` int(11) UNSIGNED NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
我刚刚更换了
protected $policies = [
'App\Model' => 'App\Policies\ModelPolicy',
Contact::class => ContactPolicy::class,
];
和
protected $policies = [
'App\Model' => 'App\Policies\ModelPolicy',
'App\Contact' => 'App\Policies\ContactPolicy',
];
现在它可以与 $this->authorize('view', $contact);
一起使用,但中间件仍然 return 403
如果它有你的中间件,请检查你的路由 link 如果它有你的中间件,你可以设置它。
Route::get('/view', CONTROLLER@view)->middleware('YOUR-MIDDLEWARE');
示例:
Route::get('/view', UserController@view)->middleware('auth:user');
我知道这是一个老问题,但如果其他人遇到这个问题,请确保查看控制器以确定是否在函数调用中声明了模型
楼主的代码应该是
EditController.php
public function view(Contact $contact)
和web.php
Route::get('/contact/edit/{contact}', 'EditContactController@view')->middleware('can:view,contact');
这样依赖注入才能正常工作
如果您将模型翻译成您的语言,您可以检查复数形式。
让我解释一下:
示例:模型 Pagamento
Url 鼻涕虫:pagamenti
在我的例子中,在函数内部使用检查工作正常,但使用构造函数无效:
public function edit(Pagamento $pagamenti)
{
$this->authorize('update', $pagamenti);
//..
我改了:
public function __construct()
{
//Abilita su tutto il resource
//$this->authorizeResource(Pagamento::class,'pagamento'); // Not Works
$this->authorizeResource(Pagamento::class,'pagamenti'); // Works
}
现在工作正常 ;)
希望能帮到你 ;)