2016-08-03 43 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),如果失败,则不需要自行归还。