見出し画像

deviseのベースになっているwardenを調べる



前回の投稿の続きです。
deviseにはwardenがベースになっており、
"current_user"や"user_signed_in?"を定義するうえでも、
wardenを用いていることを学びました。
このwardenとは?を調べてみたので、備忘録として残しておきます。

調べていると、この方がまとめているdeviseとwardenの関係性についてが、
とてもわかりやすかったので、参考にしています。

wardenがユーザー認証するメカニズム部分を担っており、
そのメカニズムをrailsに実装する役割をdeviseが補っています。

ここで前回のコード部分に戻ります。

def current_#{mapping} @current_#{mapping} ||= warden.authenticate(scope: :#{mapping}) end

current_(モデル名)に自己代入されている記述ですが、
wardenのauthenticateメソッドが呼び出されています。

wardenのauthenticateの処理の詳細です。

※Warden::Proxy.authenticate などで認証ができる。

wardenに設定されているstrategiesの中から実行するstrategyを取得( = winning_strategy)
・条件はscopeが適合したものと、 valid?なもの
https://github.com/wardencommunity/warden/blob/master/lib/warden/proxy.rb#L353
・winning_strategyがsuccessful?なら認証成功

認証されたユーザーを設定する
・set_user(winning_strategy.user, opts.merge!(:event => :authentication))
strategyクラス
・Warden::Strategies::Base にから提供されるparamsなどの値を用いて次のメソッドを実装する
・valid? 認証するかどうか

authenticate! 認証処理
認証が成功した場合は success!(user) のようにsuccess!メソッドに対して認証したuserを渡す

warden.authenticateで行われている処理としては、以下になります。

1.usersプロパティに値が入っていればそれを返す

2.sessionにuserのデータがあるかを探しに行く。データがあればdeserializeして、usersプロパティにセットして、返す。

3.有効なstrategiesを実行し、認証が成功したら、そのuserを返す
*有効かどうかの判定の多くはreques.paramのデータに認証に必要なkeyがあるかで判断されるので、認証用のアクション以外では基本的に有効とはならない
*例えばdatabase_authenticatable strategyでは、emailのkeyがあるかなど。

こちらの記事を参考にしています。

つまり、wardenのauthenticateメソッドが呼び出され、認証が成功した場合は success!(user) のようにsuccess!メソッドに対して認証が成功したら、
その認証が成功したuserを返している、ということです。

そこで返された値がcurrent_userに代入され、
コントローラーやviewでcurrent_userが使用できるようになっていました。


ここまで読んでいただき、ありがとうございました!
是非、コメント欄でご意見いただけると嬉しいです!

この記事が気に入ったらサポートをしてみませんか?