【问题标题】:How to authorize depending on the request?如何根据请求授权?
【发布时间】:2020-02-05 05:23:03
【问题描述】:

我目前正在向 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(),我该如何解决这个问题。如果我想使用policies

另一个问题:我看到了几种授权方式:Gate::authorize()、policies、StoreProduct 的authorize()、... 我应该使用哪一个?例如,如果我使用 policies,我是否应该始终执行 StoreProduct 的 authorize() 事件?

【问题讨论】:

  • 用户和产品是否都属于一家公司?
  • @rakete 你可以创建permissionmanage product 或个人像create productupdate product 等用户Request 类来检查用户是否有权限。如果对这种方法感兴趣,请告诉我,我会添加一些示例代码
  • @Bryan 公司有很多用户。产品有一家公司。
  • @MikeRoss 嗯,我已经创建了权限。检查权限不是问题。问题是,决定用户是否被授权的模型(用户的公司)将作为 company_id 传递。
  • 如果您的用户只属于一家公司,我将依赖关系(假设您在 User 模型中有一个 belongsTo):$company = $request->user()->company;

标签: laravel laravel-5 laravel-authorization


【解决方案1】:

您可以让ProductPolicy 上的create 能力将公司实例作为参数,然后您可以在策略中检查用户是否属于该公司:

use App\Company;
use App\User;

class ProductPolicy
{
    public function create(User $user, Company $company)
    {
        return $user->company_id === $company->id;
    }

    ...
}

您可以在控制器中调用authorize 以使用ProductPolicy 来授权用户。这些授权方法可以将数组作为第二个参数,它允许您发送额外的数据[第一个参数将是策略的模型,在这种情况下它不需要实例,但我们仍然需要它知道哪个模型的我们想要的策略,所以它需要类名]。这将检查 Product 策略上的 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');
}

记得为产品型号注册政策。

您可以选择如何进行授权,这就是为什么有不同的方法来实现它。取决于您喜欢什么或适合您当前的需求。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-11
    • 2016-05-31
    • 1970-01-01
    • 2021-03-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多