2014-11-08 3 views
0

Devise의 로그 아웃 경로를 재정 의하여 request.referer로 지정했습니다. 그 문제는 사용자가 authenticate_user가있는 페이지에있는 경우입니다! 필터를 적용하기 전에 로그인 페이지로 이동하여 오류가 표시되었습니다. 이것은 이상적인 것이 아니며 사용자가 인증 요구 사항이있는 경로에서 오는 경우에만 root_path로 리디렉션하려고합니다. 이 작업을 수행하는 가장 좋은 방법은 무엇입니까?devise의 리디렉션 경로를 로그 아웃

답변

0

리퍼러 URL이 연결된 컨트롤러의 콜백을 검사하는 결과를 보았습니다. authenticate_*! 콜백이 있으면 @if 인스턴스 변수에 지정된 작업이 있는지 각각 검사합니다. 없음이 있으면 콜백이 모든 작업에 적용되며 참조하는 URL이 제한된 작업의 것이라는 것을 알고 있습니다. 지정된 동작이있는 경우 regex를 사용하여 참조 동작이 제한되는지 여부를 확인합니다.

기준을 충족시키는 모든 콜백이 배열에 추가됩니다. 콜백을 반복 한 후 해당 배열이 비어 있는지 확인합니다. 이 경우 사용자는 request.referer으로 다시 보냅니다. 비어 있지 않은 경우 request.referer으로 전송하면 로그인 페이지로 리디렉션되고 오류가 표시됩니다. 이 경우 사용자는 root_path으로 전송됩니다.

오류가 발생하면 사용자는 root_path으로 전송됩니다.

def after_sign_out_path_for(resource_or_scope) 
    begin 
    controller_name = Rails.application.routes.recognize_path(request.referer)[:controller] 
    controller_class = "#{controller_name}_controller".camelize.constantize 
    authentication_callbacks = controller_class._process_action_callbacks.select { |callback| callback.filter.match /authenticate_\w+!/ } 
    action_name = Rails.application.routes.recognize_path(request.referer)[:action] 

    restricting_callbacks = [] 

    authentication_callbacks.each do |callback| 
     callback_scope = callback.instance_variable_get(:@if) 
     if callback_scope.empty? || callback_scope.first.match(/action_name\s==\s(\'|\")#{Regexp.quote(action_name)}(\'|\")/) 
     restricting_callbacks << callback 
     end 
    end 

    restricting_callbacks.empty? ? request.referer : root_path 
    rescue Exception => e 
    request.referer 
    end 
end 
: 여기

코드입니다
관련 문제