2016-08-03 85 views
0

我想創建一個項目來添加編輯聯繫人。如何在Laravel 5.2中創建不帶參數的策略?

要限制用戶可以添加/編輯自己的聯繫人,因此增加政策ContactPolicy如下

<?php 

namespace App\Policies; 

use Illuminate\Auth\Access\HandlesAuthorization; 
use App\User; 
use App\Contact; 

class ContactPolicy 
{ 
    use HandlesAuthorization; 

    /** 
    * Create a new policy instance. 
    * 
    * @return void 
    */ 
    public function __construct() 
    { 
     // 
    } 
    public function before($user, $ability) 
    { 
     if ($user->isAdmin == 1) { 
      return true; 
     } 
    } 

    public function add_contact(User $user) 
    { 
     return $user->id; 
    } 

    public function update_contact(User $user, Contact $contact) 
    { 
     return $user->id === $contact->user_id; 
    } 
} 

而且在AuthServiceProvider註冊如下

protected $policies = [ 
     'App\Model' => 'App\Policies\ModelPolicy', 
     Contact::class => ContactPolicy::class, 
    ]; 

要限制由當前用戶的添加好友我在下面我的控制器功能中添加了Gate,但不通過參數

if (Gate::denies('add_contact')) { 
      return response('Unauthorized.', 401); 
     } 

即使當前用戶嘗試添加聯繫人,它也會顯示未經授權的消息。

我該如何解決這個問題?

+0

該方法必須返回一個布爾值,但是您的* add_contact()*方法返回'return $ user-> id;'並且它可能不起作用,因爲您需要參數** $ user **,而您不需要包括從控制器調用門的時候。 – TheFallen

回答

0

策略的目的是在一個地方擁有與某個特定資源類別相關的所有授權邏輯。

因此,您定義Contact::class => ContactPolicy::class意味着ContactPolicy具有關於聯繫人的所有策略。當您編寫Gate::denies('add_contact')時,框架如何知道要搜索哪個策略?您必須傳遞Contact類型的對象作爲第二個參數才能訪問ContactPolicy。

無論如何,事實上有一個寫授權邏輯的地方,它不是特定於任何類別的資源。在該方法的AuthServiceProviderboot你可以添加

$gate->define('add_contact', function ($user) { 
     return $user->id; 
}); 

順便說一句,什麼是與返回的用戶ID的用意何在?我想你只需要返回一個布爾值。

此外,如果您正在檢查控制器內的權限,則應該只需調用$this->authorize('add_contact'),並且控制器本身將檢查並返回Forbidden響應(正確代碼爲403,而不是401),如果失敗,則不需要自行歸還。