Laravel策略始终返回false

时间:2018-11-13 16:22:20

标签: php mysql laravel policies

我已经创建了策略,并添加了方法视图:

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相同。 另外,联系表方案:

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;

4 个答案:

答案 0 :(得分:0)

我刚刚替换了

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);一起使用,但是中间件仍然返回403

答案 1 :(得分:0)

请检查到该方法的路由链接(如果它具有中间件),如果没有,您可以将其设置为

Route :: get('/ view',CONTROLLER @ view)->中间件('YOUR-MIDDLEWARE');

示例:

Route :: get('/ view',UserController @ view)->中间件('auth:user');

答案 2 :(得分:0)

我知道这是一个古老的问题,但是如果有人遇到这个问题,请确保您查看控制器以确定是否在函数调用中声明了模型

原始海报的代码中,应该是

EditController.php

public function view(Contact $contact)

和web.php

Route::get('/contact/edit/{contact}', 'EditContactController@view')->middleware('can:view,contact');

以便依赖项注入可以正常工作。

答案 3 :(得分:0)

如果您在lang中翻译模型,则可以检查复数形式。

让我解释一下:

示例:模型 Pagamento

网址上的子弹: 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

}

现在工作正常;)

希望可以提供帮助;)