Я догадываюсь, почему Rails не представила это исключение, потому что авторизация и аутентификация не являются поведением Rails (не считая basicauth, конечно).
Обычно это обязанности других библиотек Devise для NotAuthenticated; Pundit, CanCanCan, Rollify для NotAuthorized) Я бы на самом деле утверждают, что это может быть плохая вещь, чтобы расширить ActionController
с пользовательскими исключениями, как ActionController::NotAuthorized
(потому что, как я сказал, что это не будет ответственность)
Так путь, как я обычно решать эту проблему в том, что Я представил пользовательские исключения на 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
Поэтому в моих контроллеров я могу сделать
class MyStuff < ApplicationController
def index
if current_user.admin?
# ....
else
raise ApplicationController::NotAuthorized
end
end
end
Это четко определяет, что слой вы Ожидая, что это исключение будет поднято и поймано, это ваш прикладной уровень, а не сторонний lib.
Дело в том, что библиотеки могут меняться (и да, это означает, что Rails тоже) определение исключений на 3-й партии Lib классов и спасая их в прикладном уровне действительно опасно, как будто смысл класса исключения изменяет это тормозит ваш rescue_from
вы можете прочитать много статей, где люди Уоринг о Rails raise
- rescue_from
будучи современным goto
(в настоящее время рассматривает антишаблон среди некоторых экспертов), а также в определенной степени это верно, но только если вы спасая исключения, которые вы не У меня полный контроль!
Это означает, что сторонние исключения (включая Devise и Rails до определенной точки). Если вы определяете классы исключений в своем приложении, вы не ретранслируете на третьей стороне lib => у вас есть полный контроль => вы можете rescue_from
, не считая это анти-шаблоном.
код ошибки http 401 означает несанкционированный доступ, вы можете сказать, что рельсы возвращают код состояния 401 и отображают любой вид, который вы хотите –
@MohammadAbuShady - я считаю, что он ищет sth, как 'raise ActionController :: RoutingError.new (' Not Found ') ', который автоматически заставляет приложение отображать 404 без каких-либо аварийных статусов. – BroiSatse
Я обычно использую devise + cancan, приятную комбинацию для аутентификации и авторизации. –