2013-05-02 28 views
5

Tôi đang tự hỏi cách triển khai chiến lược xác thực tùy chỉnh bằng cách sử dụng devise :token_authenticable.Chiến lược xác thực tùy chỉnh cho phát triển Sử dụng: token_authenticable

Tôi đã tìm thấy hướng dẫn về cách thực hiện bằng mô hình sử dụng devise :database_authenticatable được bao gồm here.

Mô hình im cố gắng xác thực được đặt tên là Pupil. Vì vậy, đây là chiến lược hiện tại của tôi (nằm trong config/initializers/custom_auth.rb):

Warden::Strategies.add(:auth_pupil_strategy) do 
    # missing valid? method indicates this strategy is always applied 

    def authenticate! 
    fail!("YOU SHALL NOT PASS!") 
    end 
end 

Và trong tôi config/initializers/devise.rb (cũng đã thử nó mà không có sự :scope => :pupil):

config.warden do |manager| 
    manager.default_strategies(:scope => :pupil).unshift :auth_pupil_strategy 
end 

Vì vậy, điều này sẽ dẫn đến việc người dùng không beeing thể để đăng nhập, nhưng bằng cách nào đó chiến lược này không được áp dụng khi chuyển từ devise :database_authenticatable sang devise :token_authenticable.

Có thể tôi chỉ thiếu đúng :scope tại đây.

Bây giờ, đây là điều kỳ lạ: Bất cứ khi nào người dùng nhập mã thông báo không hợp lệ, chiến lược của tôi được gọi và "BẠN SALL KHÔNG CHẠY!" Được trả lại. Tuy nhiên khi mã thông báo chính xác được cung cấp, người dùng có thể đăng nhập tốt.

+0

xấu hổ mà không ai là abl e để giúp bạn với điều này. Bạn có thể tìm được giải pháp không? – seanhussey

+0

có thể http://kyan.com/blog/2013/10/11/devise-authentication-strategies sẽ trợ giúp? –

+0

Bạn phải triển khai 'hợp lệ?' phương pháp cho chiến lược của bạn. Tôi không biết liệu điều đó có giải quyết được gì không, nhưng chắc chắn đó là điều kiện tiên quyết cho bất kỳ chiến lược nào (xem ví dụ: liên kết của John Beynon). – conciliator

Trả lời

0

Chiến lược của bạn không được gọi vì bạn cần ghi đè lên hợp lệ? phương pháp như this câu trả lời đề nghị;

Nhưng bạn cũng nên sử dụng phương pháp chiến lược mặc định, tuy nhiên cách thức mà nó được dự định sẽ được sử dụng là khác, chúng ta hãy xem các declaration

def default_strategies(*strategies) 
    opts = Hash === strategies.last ? strategies.pop : {} 
    hash = self[:default_strategies] 
    scope = opts[:scope] || :_all 

    hash[scope] = strategies.flatten unless strategies.empty? 
    hash[scope] || hash[:_all] || [] 
end 

như bạn có thể thấy phương pháp này được cho là nhận được một mảng chiến lược , không chỉ phạm vi, sử dụng unshift là một hack thông minh mà đặt chiến lược của bạn ở phía trên cùng của đống, nhưng đối với một số lý do có hành vi bất ngờ khi được làm việc với nhiều chiến lược tùy chỉnh

hy vọng giúp

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