【问题标题】:Custom Authentication Strategy for Devise Using :token_authenticable使用 :token_authenticable 设计的自定义身份验证策略
【发布时间】:2013-05-02 10:20:07
【问题描述】:

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

我已经找到了有关如何使用 devise :database_authenticatable 对模型进行操作的说明,该模型已涵盖在 here 中。

我试图验证的模型名为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

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

【问题讨论】:

  • 很遗憾没有人能帮助你解决这个问题。你找到解决办法了吗?
  • 你必须实现一个“有效?”方法为您的策略以及。我不知道这是否能解决任何问题,但它肯定是任何策略的先决条件(参见例如 John Beynon 的链接)。

标签: ruby-on-rails devise warden


【解决方案1】:

您的策略没有被调用,因为您需要覆盖有效的?方法为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 是一种巧妙的技巧,可以将您的策略​​置于堆的顶部,但由于某种原因,在使用时会出现意外行为多种自定义策略

希望有帮助

【讨论】:

    猜你喜欢
    • 2011-05-12
    • 1970-01-01
    • 2021-03-23
    • 2012-01-29
    • 2015-05-21
    • 2020-07-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多