레일즈가이 예외를 도입하지 않은 이유는 권한 부여 및 인증이 레일스 고유의 동작 (물론 기본 인증을 고려하지 않음)이 아니기 때문이라고 생각합니다.
일반적으로 이들은 다른 라이브러리의 책임입니다. Devise for NotAuthenticated; Pundit는 CanCanCan는 NotAuthorized에 대한 Rollify)는 실제로 같은 나는
이 그래서 방법 나는 보통이 문제를 달려 드는 방법이다
책임)입니다 아니라고 말했다 있기 때문에 (ActionController::NotAuthorized
같은 사용자 정의 예외 ActionController
을 확장하는 나쁜 일이 될 수 있습니다 주장 나는 그러므로 내 컨트롤러에서 나는이 명확하게 정의
class MyStuff < ApplicationController
def index
if current_user.admin?
# ....
else
raise ApplicationController::NotAuthorized
end
end
end
을 할 수 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
에서 사용자 정의 예외를 도입했습니다 레이어 당신의 애 썼는데 그 이 예외를 발생 시켜서 잡아내는 것은 제 3 자 lib가 아닌 응용 프로그램 계층입니다.
제 3 자 lib 클래스에서 예외를 정의하고 응용 프로그램 계층에서 구조를 변경하면 라이브러리가 변경 될 수 있습니다 (예, 레일을 의미 함). 예외 클래스 변경의 의미가 브레이크를 걸는 것처럼 실제적으로 위험합니다 rescue_from
사람들이 많이있는 레일을 raise
- rescue_from
(현재 일부 전문가들 사이에서 안티 패턴을 고려하고 있음) 인 많은 기사를 읽을 수 있으며 특정 확장은 사실이지만 당신이 입는 예외 완전히 통제 할 수 없어!
즉 제 3 자 예외 (특정 지점에 대한 Devise 및 Rails 포함)를 의미합니다. 응용 프로그램에서 예외 클래스를 정의하면 타사 lib에서 중계하지 않습니다. => 전체 제어 => 사용자는 rescue_from
을 사용할 수 있습니다.
http 오류 코드 401은 권한이 없다는 것을 의미하며, 401 상태 코드를 반환하도록 레일스에 알리고 원하는 모든보기를 렌더링합니다. –
@MohammadAbuShady - 저는 그가 ActionController :: RoutingError.new (' 찾을 수 없음 ')'을 선택하면 응급 statmenets없이 응용 프로그램을 자동으로 렌더링합니다 (404). – BroiSatse
나는 대개 단지 devise + cancan을 사용합니다. 인증 및 권한 부여를위한 좋은 조합입니다. –