2011-09-25 32 views
2

我創建了自己的守望者戰略,使用Devise。它與Devise :: Strategies :: DatabaseAuthenticatable非常相似,實際上它從它繼承並重新實現了身份驗證!移除守望者戰略 - 如何確保原始devise_authenticable策略不見了

我的問題是,我想確保最初的devise_authenticable Warden戰略不復存在。這並不在Warden會嘗試的策略列表中,因爲它實際上是一個安全問題。那可能嗎?

回答

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和1.0.5舍監):

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

到目前爲止,它似乎工作正常。 – Pablo

0

我只是實現這一點。設計將嘗試列表中的每個策略,直到一個成功。

對我來說,我並沒有替換:database_authenticatable策略,而是將我的策略添加到列表的開頭,並彈出:database_authenticatable off在現有列表的末尾。

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