Chciałem zapytać, czy istnieje jakiś prosty sposób wygenerowaniem statusu 404 w wybranym momencie i wymuszenie na przegądarce wyświetlenie standardowego komunikatu o tym. W Django wystarczyło rzucić wyjątkiem Http404 i wszystkim zajmował sie framework.
Jak użytkownik nie ma uprawnień to HTTP 401 Unauthorized lub HTTP 403 Forbidden. HTTP 404 Not Found zwracasz gdy strona nie istanieje, i nie powinno to mieć powiązania w żaden sposób z uprawnieniami. Możesz zastosować drabinke sprawdzeń najpierw 401 gdy użytkownik nie ma dostępu a potem 404 gdy po zalogowaniu strona nie istnieje.
@wafcio w praktyce widziałem kilkakrotnie użycie 404 w przypadku braku uprawnień. Chodziło o ukrycie faktu, że konkretna strona istnieje. Na przykład, jeśli sklep używa ze standardowego, inkrementalnego generowania id, mogę po kolej wchodzić na GET /orders/:id - w momencie, gdy otrzymuję 403, wiem, że takie zamówienie istnieje. 404 oznacza, że zamówienia nie ma, więc prawdopodobnie ostatni numer, który zwrócił 403 to całkowita ilość zamówień w danym sklepie.
@Draqun jeśli chodzi o generowanie takiego statusu, to możesz zrobić tak
if has_access?(record)
render json: record
else
render :nothing, status: :not_found
end
albo rzucić wyjątek (np. raise UnauthorizedAccessError) a w application_controller.rb napisać:
rescue_from UnauthorizedAccessError
render :nothing, status: :not_found
end
wtedy kiedykolwiek rzucisz ten wyjątek, strona zwróci 404
Statusy HTTP nie po to zostały stworzone żeby ograniczać się do 200 i 404 (ew. jeszcze 201). A to że inni używają tego nieprawidłowo, nie oznacza, że trzeba powtarzać błędne podejście.
No tak, oczywiście, bo to my powinniśmy dostosować się do narzędzi a nie dostosować narzędzia do siebie. Skoro ktoś kilkadziesiąt lat temu nie przewidział, że zwrócenie 403 może ujawniać niechciane informacje, to nie możemy skorzystać z innych narzędzi do ich ukrycia