Pec*_*277 2 php authorization laravel
我有一个包含用户和产品的应用程序。只有产品所有者才能查看产品。
如果用户猜测产品 ID,他们可能能够查看该产品。例如
http://booker.app/admin/products/32
Run Code Online (Sandbox Code Playgroud)
点击该链接将允许任何登录用户查看 ID 为 32 的产品。
这是有问题的路线:
Route::middleware(['middleware' => 'auth'])->prefix('admin')->group(function(){
Route::resource('products', 'ProductController');
});
Run Code Online (Sandbox Code Playgroud)
我的产品控制器显示方法:
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'));
}
Run Code Online (Sandbox Code Playgroud)
禁止和 makeResponse 函数只是检查请求是否是 ajax 请求,如果是则返回 json。
正如您所看到的,我正在使用路由模型绑定,并且正在检查授权用户是否与产品 user_id 相同。基本上有没有更好的方法来检查用户是否是产品的所有者。
在 Laravel 中,您可以定义策略来指定数据层的 ACL 和访问逻辑。
例如创建类ProductPolicy:
class ProductPolicy
{
public function show(User $user, Product $product)
{
return $user->id === $product->user_id;
}
}
Run Code Online (Sandbox Code Playgroud)
然后将策略绑定到Product模型,将以下行插入到$policies数组中AuthServiceProvider:
protected $policies = [
Product::class => ProductPolicy::class,
];
Run Code Online (Sandbox Code Playgroud)
现在,在您的控制器方法中,您可以使用以下语法来授权用户执行特定操作
public function show(Product $product)
{
$this->authorizeForUser(Auth::user(), 'show', [$product]);
return $this->makeResponse('admin.products.product', compact('product'));
}
Run Code Online (Sandbox Code Playgroud)
该方法authorizeForUser将调用show您的策略的方法,true仅当产品属于经过身份验证的用户时,该方法才会返回。
希望能帮助到你。