2012-08-17 2 views
6

API에 액세스하기위한 맞춤 인증 전략을 만들고 싶습니다. 나는 Devise ignoring custom strategy에 예제 코드를 따라 갔다.Devise가 내 맞춤 전략을 무시합니다.

문제는 유효한? 메소드는 내 Api 전략에서 결코 실행되지 않습니다.

내 코드 :

module Devise 
    module Strategies 
    class Api < Devise::Strategies::Base 
     def valid? 
     binding.pry 
     params[:request_source] == 'api' 
     end 

     def authenticate! 
     #do stuff here 

     if user 
      success!(user) 
     else 
      warden.custom_failure! 
      render :json=> {:success=>false, :message=>"Error with your login or password"}, :status=>401 
     end 
     end 
    end 

    Warden::Strategies.add(:api, Devise::Strategies::Api) 

    end 
end 

와 유증 이니셜로는 :

내가 지금 무엇
config.warden do |manager| 
    manager.default_strategies.unshift :api 
end 

, 고안 항상 기본 전략을 사용할 것 같다. AFAIK,이

... 충분해야한다 ------- 편집 -------- 내 유증 이니셜의 맨 위에이 같은 전략이 필요

:

require Rails.root.join('app/devise/strategies/api') 

나는 클래스 내에 호출을 넣으면 전략이 부팅 될 때로드된다는 것을 알고 있습니다. 그러면 클래스가 시작됩니다. 그러나 Pry 호출은 결코 실행되지 않습니다. : -S

답변

4

답변을 찾았습니다!

config.warden do |manager| 
    manager.default_strategies(scope: :user).unshift :api 
end 

가 작동하도록 :

나는 이것을 사용했다. 이상한 일은, 그물에서 본 많은 샘플 코드가 그것을 사용하지 않았다는 것입니다 : -S

0

맞춤 전략은 언제 필요합니까? 예제와 비교하여, 이니셜 라이저 대신에 전략을 추가하려고합니다. initial_strategies에 추가하기 전에로드 된 것을 확인하기 위해 초기화 도구의 맨 위에 사용자 지정 전략을 요구할 수도 있습니다.

그럴 필요가 없다면 default_strategies를 확인하기 위해 authenticate가 호출 된 곳에서 임시 puts 문을 추가하는 것을 두려워하지 마십시오. 즉, 만약 당신이 이미 디버거를 사용하여 편하지 않은, 내가 뭘 할 것입니다.

+0

나는이 줄을 장치 초기화 프로그램의 맨 위에두고 있습니다 : require Rails.root.join ('app/devise/전략/api ') 전략에 내부 호출을 추가하면 레일 응용 프로그램이 시작될 때로드됩니다. 하지만 내가 가지고있는 전화는 모두 유효합니까? 메서드가 호출되지 않습니다. – Alain

관련 문제