我想知道如何使用devise :token_authenticable
设计自定义身份验证策略。
我已经找到了有关如何使用涵盖here devise :database_authenticatable
的模型进行操作的说明。
我尝试进行身份验证的模型名为Pupil
。
所以这是我目前的策略(位于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
在我的config/initializers/devise.rb
中(也尝试过没有:scope => :pupil
):
config.warden do |manager|
manager.default_strategies(:scope => :pupil).unshift :auth_pupil_strategy
end
因此,这会导致用户无法登录,但在从devise :database_authenticatable
切换到devise :token_authenticable
时,不会以某种方式应用此策略。
也许我在这里错过了正确的:scope
。
现在,这里有一个奇怪的事情:每当用户输入无效令牌时,我的策略就会被调用,而且#34;你不会通过!"退回。 但是,当提供正确的令牌时,用户可以正常登录。
答案 0 :(得分:0)
您的策略未被调用,因为您需要覆盖有效的?方法this回答建议;
但是你也应该使用默认策略方法,但是它的使用方式是另一种,让我们看看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
正如你所看到的那样,该方法应该接收一系列策略,不仅仅是范围,使用unshift是一个聪明的黑客,它将你的策略置于堆的顶端,但由于某种原因,在使用时出现意外行为多种自定义策略
希望帮助