Laravel只允许所有者用户访问路由

时间:2017-08-02 16:37:51

标签: php laravel authorization

我有一个包含用户和产品的应用程序。只有产品所有者才能查看产品。

如果用户猜到产品ID,他们可能会查看该产品。例如

http://booker.app/admin/products/32

以下链接将允许任何登录用户查看ID为32的产品。

这是有问题的路线:

Route::middleware(['middleware' => 'auth'])->prefix('admin')->group(function(){
    Route::resource('products', 'ProductController');
});

我的产品控制器显示方法:

public function show(Product $product)
{        
    if($product->user_id !== Auth::user()->id){        
        return $this->forbidden('admin/products');
    }

    return $this->makeResponse('admin.products.product', compact('product'));
}

forbidden和makeResponse函数只是检查请求是否是ajax请求,如果是,则返回json。

正如您所看到的,我正在使用路由模型绑定,并且我正在检查授权用户是否与产品user_id相同。基本上有更好的方法来检查用户是否是产品的所有者。

1 个答案:

答案 0 :(得分:2)

在Laravel中,您可以定义Policies,以便为数据层指定ACL和访问逻辑。

例如,创建班级ProductPolicy

class ProductPolicy
{

    public function show(User $user, Product $product)
    {
         return $user->id === $product->user_id;
    }

}

然后将政策绑定到Product模型,将以下行插入$policies中的AuthServiceProvider数组:

protected $policies = [
    Product::class => ProductPolicy::class,
];

现在,在您的控制器方法中,您可以使用以下语法来授权用户执行某项操作

public function show(Product $product)
{
    $this->authorizeForUser(Auth::user(), 'show', [$product]);

    return $this->makeResponse('admin.products.product', compact('product'));
}

方法authorizeForUser将调用您的策略的show方法,仅当产品属于经过身份验证的用户时,才会返回true

希望它有所帮助。