Как авторизоваться в зависимости от запроса? - PullRequest
1 голос
/ 08 октября 2019

В настоящее время я добавляю права / роли / авторизацию для приложения 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's authorize(), ... Какой из них использовать? Должен ли я всегда реализовывать событие StoreProduct authorize(), если я использую, например, policy ?

1 Ответ

2 голосов
/ 16 октября 2019

Вы можете иметь возможность create на ProductPolicy принимать экземпляр Компании в качестве аргумента, а затем вы можете проверить, что пользователь принадлежит этой компании в политике:

use App\Company;
use App\User;

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

    ...
}

Вы можетевызовите 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');
}

Не забудьте зарегистрировать Политику для модели Продукта.

Выесть варианты, как вы хотите сделать авторизацию, поэтому есть разные методы для ее достижения. Зависит от того, что вы предпочитаете или что соответствует вашим текущим потребностям.

...