Rails - 404 gdy nie użytkownik nie ma uprawnień

Witam

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.

Jakies propozycje?

Pozdrawiam.

head 404

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.

1 Like

Ale z takim podejściem to firewalle powinny odpowiadać na pingi, etc. zamiast milczeć i logować z jakiego IP był skan. Totalna bzdura.

1 Like

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

@Arnvald

Dzieki wielkie!