laravel - 如何根据请求进行授权?

标签 laravel laravel-5 laravel-authorization

我目前正在向 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/

相关文章:

php - 第 68 行的 fatal error : Undefined class constant 'MYSQL_ATTR_SSL_CA' in/var/www/laravel/config/database. php

apache - Laravel 虚拟主机不起作用

php - Laravel 中如何将私有(private)资源映射到公共(public)资源?

php - 当发送错误的访问 token 时,Passport 返回 500 错误(没有响应)

laravel - 使用 Laravel 5.1 授权方法时如何返回自定义 403 异常

mysql - laravel where 子句中的内部查询

javascript - 在 Laravel 5 中通过 URL 传递数据集?

laravel - .blade 在 Laravel 框架中有什么用?

javascript - 如何在ajax url中使用laravel路由