6

我想知道如何使用设计实现自定义身份验证策略devise :token_authenticable

我已经找到了有关如何使用此处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这里的权利。

现在,奇怪的是:每当用户输入无效的令牌时,我的策略就会被调用并且“你不能通过!” 被退回。但是,当提供正确的令牌时,用户可以正常登录。

4

1 回答 1

0

你的策略没有被调用,因为你需要覆盖有效的?这个答案建议的方法;

但是你也应该使用默认策略方法,但是它的使用方式是另一种方式,让我们看看声明

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 是一种巧妙的技巧,可将您的策略​​置于堆的顶部,但由于某种原因,在使用多个自定义策略时会出现意外行为

希望有帮助

于 2015-06-26T17:08:16.467 回答