2012-08-17 31 views
6

Tôi muốn tạo chiến lược xác thực tùy chỉnh để truy cập API. Tôi đã theo mã mẫu tại Devise ignoring custom strategy.Devise bỏ qua chiến lược tùy chỉnh của tôi

Vấn đề là hợp lệ? phương pháp trong chiến lược Api của tôi là không bao giờ chạy (dựa trên cố gắng để nâng lên trong nó).

Mã của tôi:

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 

và trong initializer devise:

config.warden do |manager| 
    manager.default_strategies.unshift :api 
end 

Tôi phải làm gì bao giờ hết, nó có vẻ như lập mưu luôn luôn sử dụng chiến lược mặc định của nó. AFAIK, điều này sẽ là đủ ...

------- EDIT --------

tôi đòi hỏi chiến lược như thế này ở đầu rất của initializer devise tôi:

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

Tôi biết chiến lược được tải vào lúc khởi động vì nếu tôi đặt một cuộc gọi nâng lên trong lớp, nó sẽ bắt đầu một phiên nâng lên. Nhưng các cuộc gọi Pry bên trong các phương pháp không bao giờ chạy. : -S

Trả lời

4

Tìm câu trả lời!

tôi đã phải sử dụng này:

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

để làm cho nó làm việc. Điều kỳ lạ là, rất nhiều mã mẫu tôi thấy trên mạng không sử dụng nó: -S

0

Khi nào bạn yêu cầu chiến lược tùy chỉnh của mình? So với ví dụ, bạn đang thêm chiến lược ở đó thay vì trong bộ khởi tạo của bạn. Bạn có thể thử yêu cầu chiến lược tùy chỉnh ở đầu bộ khởi tạo của bạn để đảm bảo chiến lược được tải trước khi bạn thêm nó vào default_strategies.

Nếu điều đó không thực hiện thủ thuật, đừng ngại thêm một số câu lệnh đặt tạm thời ngay trong khi tự xác định nơi xác thực được gọi để kiểm tra default_strategies. Đó là, nếu bạn không phải là confortable bằng cách sử dụng trình gỡ lỗi, đó là những gì tôi sẽ làm.

+0

Tôi có dòng này ở đầu trình tạo khởi tạo: yêu cầu Rails.root.join ('app/devise/chiến lược/api ') và nếu tôi thêm một cuộc gọi nâng lên bên trong chiến lược, nó sẽ được tải khi ứng dụng đường ray bắt đầu. NHƯNG tất cả các cuộc gọi pry tôi có bên trong hợp lệ? phương pháp không bao giờ được gọi. – Alain

Các vấn đề liên quan