Ограничение обновления на конечной точке API для неавторизованных пользователей - PullRequest
0 голосов
/ 18 сентября 2018

Я создал приложение только для API с использованием ресурса API и паспорта для аутентификации.Приложение выполняет следующие действия:

  1. Разрешить всем перечислять все книги и просматривать определенную книгу
  2. Разрешать только зарегистрированным пользователям добавлять, обновлять и удалять принадлежащие им книги

Используя почтальон, приложение работает как задумано, за исключением операций обновления и удаления.Если пользователь пытается обновить не принадлежащую ему книгу, я хочу получить ответ об ошибке.К сожалению, я получаю код состояния 200 Ok вместо своего специального сообщения и код состояния 403.То же самое и с удалением.

Это мои методы обновления и удаления BookController

public function update(Request $request, Book $book)
{
    // Update book if the logged in user_id is the same as the book user_id
    if ($request->user()->id === $book->user_id) {
        $book->update($request->only(['title', 'author']));

        return new BookResource($book);
    } else {
        response()->json(['error' => 'You do not have the permission for this operation'], 403);
    }
}

public function destroy(Request $request, Book $book)
{
    // Delete book only if user_id matches book's user_id
    if ($request->user()->id === $book->user_id) {
        $book->delete();

        return response()->json(null, 204);
    } else {
        response()->json(['error' => 'You do not have the permission for this operation'], 403);
    }
}

ПРИМЕЧАНИЕ: при тестировании в почтальоне я просто добавляю токен на предъявителя в поле авторизации заголовков,Работает, когда пользователь владеет книгой, но получает 200 вместо кода состояния 403. Когда книга не принадлежит зарегистрированному пользователю.

Что я делаю неправильно и как я могу это исправить?

1 Ответ

0 голосов
/ 18 сентября 2018

Вы, похоже, не возвращаете свой ответ в выражении else - вы можете упростить его следующим образом:

public function update(Request $request, Book $book)
{
    // Update book if the logged in user_id is the same as the book user_id
    if ($request->user()->id === $book->user_id) {
        $book->update($request->only(['title', 'author']));

        return new BookResource($book);
    }

    return response()->json([
        'error' => 'You do not have the permission for this operation'
    ], 403);
}

public function destroy(Request $request, Book $book)
{
    // Delete book only if user_id matches book's user_id
    if ($request->user()->id === $book->user_id) {
        $book->delete();

        return response()->json(null, 204);
    }

    return response()->json(['error' => 'You do not have the permission for this operation'], 403);
}

Я бы также предложил рассмотреть политики - и применить их в качестве промежуточного программного обеспечения длямаршруты https://laravel.com/docs/5.7/authorization#writing-policies

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...