我目前正在向 Laravel 应用程序添加权限/角色/授权。
应用程序的数据库中有用户、公司和产品。公司有很多用户,一个产品属于一个公司。
现在我想授权公司用户为他们的公司创建产品。
在我的 ProductController.php 中,我有这样的内容:
public function create(Request $request)
{
$company = Company::findOrFail($request->get('company_id'));
return view('product.create', compact('company');
}
一种选择是在获取公司后使用 Gate::authorize()
并将 $company
传递给授权方法。
问题:但是如果我不想使用Gate::authorize()
,我该如何解决这个问题。那么如果我想使用政策?
另一个问题:我看到了几种授权方法:Gate::authorize()
、策略、StoreProduct 的 authorize()
、...
我应该使用哪一个?例如,如果我使用策略,我是否应该始终实现 StoreProduct 的 authorize()
事件?
最佳答案
您可以在 ProductPolicy
上使用 create
功能,将 Company 实例作为参数,然后您可以检查用户是否属于策略中的该公司:
use App\Company;
use App\User;
class ProductPolicy
{
public function create(User $user, Company $company)
{
return $user->company_id === $company->id;
}
...
}
您可以在 Controller 中调用authorize
以使用ProductPolicy
来授权用户。这些授权方法可以采用一个数组作为第二个参数,它允许您发送附加数据[第一个参数将是策略的模型,在本例中它不采用实例,但我们仍然需要它来知道哪个模型是我们想要的策略,因此它采用类名]。这将检查产品策略的 create
能力,并向其传递一个附加值 $company
:
use App\Company;
use App\Product;
...
public function create(Request $request)
{
$company = Company::findOrFail($request->input('company_id'));
$this->authorize('create', [Product::class, $company]);
return view('product.create', compact('company');
}
请记住注册产品型号的策略。
您可以选择如何进行授权,这就是为什么有不同的方法来实现它。取决于您更喜欢什么或什么适合您当前的需求。
关于laravel - 如何根据请求进行授权?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58277603/