Я отредактировал вопрос, так как моя первая попытка ввела в заблуждение. Простите за это.
Я создаю API с laravel и имею следующие модели/таблицы:
user
---
id
name
customers
---
id
name
user_id
projects
---
id
name
user_id
customer_id (can be NULL)
Проект всегда принадлежит пользователю и, при желании, также может принадлежать заказчику. Клиент всегда принадлежит пользователю. Например:
users = [
{id: 1, name: "user1"},
{id: 2, name: "user2"}
]
customers = [
{id: 1, name: "c1", user_id: 1},
{id: 2, name: "c2", user_id: 1},
{id: 3, name: "c3", user_id: 2}
]
projects = [
{id: 1, name: "p1", user_id: 1},
{id: 2, name: "p2", user_id: 1, customer_id: 1},
{id: 3, name: "p3", user_id: 2, customer_id: 2}
]
Как предотвратить создание неверных данных в БД путем создания или обновления проекта с идентификатором customer_id, который действительно принадлежит клиенту другого пользователя, а не user_id проекта. Например:
newProject = {id: 4, имя: "p4", user_id: 1, customer_id: 3}
Как видите, новый проект должен принадлежать пользователю 1 и заказчику 3, что невозможно.
Это именно то, что я делаю прямо сейчас, но я ищу лучший, более гибкий способ сделать это, потому что мне пришлось бы реализовать его во всех местах, где пользователь может изменить клиента (например, вложенные отношения)
Вам нужна система авторизации: laravel.com/docs/5.7/авторизация
Это действительно общий ответ. Конечно, мне нужна система авторизации.
Извините, но общий вопрос => общий ответ. Вы можете начать писать код, и, если у вас есть конкретная проблема, вы можете задать ее здесь.
Проверьте наличие laravel политика. Это поможет вам перейти на детальный уровень с разрешениями
Хорошо, теперь я понял, что мой вопрос был слишком простым и вводящим в заблуждение. сейчас я его обновил






Вы можете сделать это следующим образом.
class User extends Eloquent {
public function scopePopular($query)
{
return $query->where('votes', '>', 100);
}
}
Вы можете вызвать другой метод из своей модели, если это правда, вы можете отправить его на контроллер.
Подробнее Области запроса
Надеюсь, это будет полезно для вас :)
Мой совет: не размещайте логику авторизации внутри модели, используйте для этого контроллер.
В модели вы можете определить области, которые вы можете использовать для ограничения доступа к авторизованному списку моделей.
Вам действительно нужно прочитать главу об авторизации в файле официальные документы laravel.
Обновление: в контроллере вы можете проверить, что клиент, вводимый пользователем, является одним из пользовательских клиентов, вы даже можете использовать проверку формы запроса, если возвращает ошибку. Для проверки вы можете глянь сюда.
Извините за вводящий в заблуждение вопрос. Моя проблема не проблема авторизации. Пожалуйста, взгляните на обновленный вопрос.
Самым элегантным решением было бы использовать систему проверки запросов Laravel, потому что на самом деле это была ваша проблема: сложное ограничение проверки для входящего запроса.
Для этого:
Это способ Laravel сделать это.
Извините за вводящий в заблуждение вопрос. Моя проблема не проблема авторизации. Пожалуйста, взгляните на обновленный вопрос.
Хорошо, извините за плохой ответ. Ваша проблема связана с ограничением проверки, поскольку вы хотите создать проект только в том случае, если данные, полученные API + user_id, соответствуют определенному ограничению. Я бы порекомендовал вам проверить пользовательские правила проверки и форму (кроме имени, она работает с API) Запросить правила проверки,
Нет, это была моя вина, так как вопрос изначально вводил в заблуждение. Я думаю, что вы правы, и проверка - это путь к получению.
Хорошо, я отредактирую свой ответ, если кто-то еще зайдет на страницу, пока не ясно, где правильный ответ....
Я считаю, что вам нужно зарегистрировать политика. Следуйте инструкциям на странице документации, чтобы сделать это, а затем в свой метод политики включите следующее:
public function update(User $user, Customer $customer)
{
return $customer->user_id === $user->id;
}
и
public function create(User $user, Customer $customer)
{
return $customer->user_id === $user->id;
}
Это заставит его работать с методами create и update.
The important part to note here is:
return $customer->user_id === $user->id;
Это гарантирует, что для данных customer и useruser_id на покупателе соответствует id на user, что вам и нужно.
Чтобы заставить его работать с моделью Projects, вам нужно будет сделать это в поставщике услуг аутентификации:
class AuthServiceProvider extends ServiceProvider
{
protected $policies = [
Project::class => ProjectPolicy::class,
];
Где ProjectPolicy — это имя политики, которую вы устанавливаете при выполнении php artisan make:policy (как объяснено в связанных документах).
Ставим в контроллере галочку вот так:
Auth::id() == $customer->user_id