Deviseで使用するための独自のWarden戦略を作成しました。これはDevise::Strategies :: DatabaseAuthenticatableと非常によく似ており、実際にはそれを継承して再実装し、認証を行います。
私の問題は、元のdevise_authenticableWarden戦略がなくなっていることを確認したいということです。これは実際にはセキュリティの問題であるため、Wardenが試みる戦略のリストには含まれていません。それは可能ですか?
Deviseで使用するための独自のWarden戦略を作成しました。これはDevise::Strategies :: DatabaseAuthenticatableと非常によく似ており、実際にはそれを継承して再実装し、認証を行います。
私の問題は、元のdevise_authenticableWarden戦略がなくなっていることを確認したいということです。これは実際にはセキュリティの問題であるため、Wardenが試みる戦略のリストには含まれていません。それは可能ですか?
私の手動の検査とテストによると、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)
私もこれを実装しました。Devise は、成功するまでリスト内の各戦略を試します。
私にとっては、: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