Sto indovinando il motivo per cui Rails non ha introdotto questa eccezione perché Autorizzazione e Autenticazione non sono comportamenti nativi di Rails (non considerando ovviamente Basicauth).
Di solito queste sono le responsabilità di altre librerie Devise per NotAuthenticated; Pundit, CanCanCan, Rollify per NotAuthorized) vorrei davvero sostenere, può essere una cattiva cosa per estendere ActionController
con eccezioni personalizzate come ActionController::NotAuthorized
(perché come ho detto che non è che sia responsabilità)
Così modo come io di solito affrontato questo problema è che ho introdotto eccezioni personalizzate su ApplicationController
class ApplicationController < ActionController::Base
NotAuthorized = Class.new(StandardError)
# ...or if you really want it to be ActionController
# NotAuthorized = Class.new(ActionController::RoutingError)
rescue_from ActiveRecord::RecordNotFound do |exception|
render_error_page(status: 404, text: 'Not found')
end
rescue_from ApplicationController::NotAuthorized do |exception|
render_error_page(status: 403, text: 'Forbidden')
end
private
def render_error_page(status:, text:, template: 'errors/routing')
respond_to do |format|
format.json { render json: {errors: [message: "#{status} #{text}"]}, status: status }
format.html { render template: template, status: status, layout: false }
format.any { head status }
end
end
end
Pertanto nei miei controllori che posso fare
class MyStuff < ApplicationController
def index
if current_user.admin?
# ....
else
raise ApplicationController::NotAuthorized
end
end
end
Questo definisce chiaramente che lo strato tua exp zionare questa eccezione da sollevare e catturare è il livello dell'applicazione, non la lib di terze parti.
Il fatto è che le biblioteche possono cambiare (e sì, questo significa Rails troppo) definendo eccezione su un 3rd party classi lib e salvataggio nel livello di applicazione è davvero pericoloso come se il significato di classe di eccezione cambia frena la tua rescue_from
È possibile leggere molti articoli in cui le persone sono in guardia su Rails raise
- rescue_from
è il moderno goto
(che ora considera anti-pattern tra alcuni esperti) e in certi casi è vero, ma solo se si stanno salvando eccezioni che non si non avere il pieno controllo !!
Ciò significa eccezioni di terze parti (compresi Devise e Rails fino a un certo punto). Se definisci le classi di eccezioni nella tua applicazione, non stai inoltrando su lib di terze parti => hai il pieno controllo => puoi rescue_from
senza che questo sia un anti-pattern.
il codice di errore http 401 significa non autorizzato, è possibile dire ai binari di restituire un codice di stato 401 e rendere qualsiasi visualizzazione desiderata –
@MohammadAbuShady - Credo che stia cercando 'raise ActionController :: RoutingError.new (' Not Found ') 'che forza automaticamente l'applicazione a renderizzare 404 senza alcun statmenet di salvataggio. – BroiSatse
Di solito uso solo devise + cancan, una bella combinazione per l'autenticazione e l'autorizzazione –