删除Warden策略 - 如何确保原始的devise_authenticable策略消失

时间:2011-09-25 18:59:50

标签: ruby-on-rails devise warden

我创建了自己的Warden策略,用于与Devise一起使用。它与Devise :: Strategies :: DatabaseAuthenticatable非常相似,实际上它继承了它并重新实现了身份验证!

我的问题是,我想确保最初的devise_authenticable Warden策略消失了。这不在Warden将尝试的策略列表中,因为它实际上是一个安全问题。这可能吗?

2 个答案:

答案 0 :(得分:3)

根据我的手动检查和测试,这在devise.rb初始化程序中实现了目标:

config.warden do |manager|
  strategies = manager.default_strategies(:scope => :user)
  strategies[strategies.index(:database_authenticatable)] = :alternative_strategy
end

策略以这种方式实现(不是这个问题的一部分,但我发现有相互矛盾的信息,而且这个是使用Rails 3.1,设计1.4.7和warden 1.0.5对我有用的信息): / p>

class AlternativeStrategy < Devise::Strategies::Authenticatable
  def authenticate!
  end
end
Warden::Strategies.add(:alternative_strategy, AlternativeStrategy)

答案 1 :(得分:0)

我刚刚实现了这一点。设计将尝试列表中的每个策略,直到成功为止。

对我来说,我没有替换:database_authenticatable策略,而是将我的策略添加到列表的开头并弹出:在现有列表末尾的database_authenticatable。

config.warden do |manager|
  # Exiles::Devise::Strategies::BySite implemented in lib/.  It matches the stub in Pablo's answer
  manager.strategies.add( :by_site_auth, Exiles::Devise::Strategies::BySite )

  # add my strategy to the beginning of the list.
  manager.default_strategies(:scope => :user).unshift :by_site_auth

  # remove the default database_authenticatable strategy from the list
  manager.default_strategies(:scope => :user).pop
end