同じ質問がありましたが、私の場合、アクション"warden.options"
にリダイレクトする前にこれらがクリアされていたため、使用して解決できませんでした。sessions#new
脆弱すぎると判断したいくつかの代替案を調べた後(いくつかのDeviseクラスの拡張と既存のメソッドのエイリアス化が含まれていたため)、によって提供されるいくつかのコールバックWarden
を使用することになりました。コールバックは現在の要求/応答サイクル内で呼び出され、パラメーターはすべてオブジェクトに保持されるため、私にとってはより適切に機能しenv
ます。
これらのコールバックには名前が付けられており、この問題および関連する問題を解決するように設計されているようです。そして、それらは文書化されています!
Wardenは、現在、次のコールバックをサポートしていますwarden-1.2.3
。
after_set_user
after_authentication
(正常なサインインのログ記録に役立ちます)
after_fetch
(のエイリアスafter_set_user
)
before_failure
(失敗したサインインのログ記録に役立ちます-以下の例)
after_failed_fetch
before_logout
on_request
各コールバックはWarden::Manager
クラスに直接設定されます。失敗した認証の試行を追跡するために、これを追加しました。
Warden::Manager.before_failure do |env, opts|
email = env["action_dispatch.request.request_parameters"][:user] &&
env["action_dispatch.request.request_parameters"][:user][:email]
# unfortunately, the User object has been lost by the time
# we get here; so we take a db hit because I care to see
# if the email matched a user account in our system
user_exists = User.where(email: email).exists?
if opts[:message] == :unconfirmed
# this is a special case for me because I'm using :confirmable
# the login was correct, but the user hasn't confirmed their
# email address yet
::Rails.logger.info "*** Login Failure: unconfirmed account access: #{email}"
elsif opts[:action] == "unauthenticated"
# "unauthenticated" indicates a login failure
if !user_exists
# bad email:
# no user found by this email address
::Rails.logger.info "*** Login Failure: bad email address given: #{email}"
else
# the user exists in the db, must have been a bad password
::Rails.logger.info "*** Login Failure: email-password mismatch: #{email}"
end
end
end
コールバックを使用してbefore_logout
ログアウトアクションも追跡できると思いますが、テストしていません。prepend_
コールバックのバリエーションもあるようです。