2013年2月9日土曜日

deviseのヘルパーメソッド(user_signed_in?,current_user,user_session)について調べてみたその2 ~実行してみる編~


前回に引き続きdeviseのヘルパーメソッド(user_signed_in? ,current_user,user_session)について実際に実行して調べてみます。

ちなみに読むのがめんどい人は以下の結論


user_signed_in?:
操作してる人がログインしてればtrue、してなきゃfalse。
他の人のログイン状態とかは関係ない。

current_user:
操作している人のユーザ情報(deviseの認証につかってるやつ)がとれる。
ログインしてなきゃnil。
ムロン他の人のは取れない。

user_session:
初期状態は空っぽ。
(おそらく)ユーザごとのセッションデータのいれもの。


だけ目を通してマンガ喫茶に行ってジョジョの奇妙な冒険でも読むのがいいと思います。

以下のようなコードを書いておき
    logger.debug 'ここからテスト用ログ'
    result = user_signed_in?
    logger.debug 'result is ' + result.to_s

    login_user = current_user
    if login_user
      logger.debug 'current user email is ' + login_user.email.to_s
    else
      logger.debug 'current user is nil'
    end

    # 現在のログインユーザ情報を取得
    login_user = user_session

    # 一応nilチェック
    if login_user
      logger.debug 'login_user :' + login_user.to_s
    else
      logger.debug 'login_user is nil'
    end
    logger.debug 'テスト用ログここまで'



以下のようなパターンで出力させてみる。
  1. 誰もログインしていない場合
  2. test1ユーザだけがログインしている場合でそのセッションを張っているブラウザからアクセス
  3. test1ユーザだけがログインしている場合でそのセッションを張っていないブラウザからアクセス
  4. test1,test2ユーザ二人がログインしている場合に各々のセッションを張っているブラウザからアクセス
このうち3,4については同じ種類のブラウザだと、
『セッションが共有されて上手くテストができない!』*1
とか言うケースも考えられるのでchromeとFireFox2つのブラウザから試して見ることにした。
で、結果は以下。
1. 誰もログインしていない場合
ここからテスト用ログ
result is false
current user is nil
login_user is nil
テスト用ログここまで

2.test1ユーザだけがログインしている場合でそのセッションを張っているブラウザからアクセス
ここからテスト用ログ
  User Load (0.0ms)  SELECT "users".* FROM "users" WHERE "users"."id" = 2 LIMIT 1
result is true
current user email is test1@aa.bb
login_user :{}
テスト用ログここまで

3.test1ユーザだけがログインしている場合でそのセッションを張っていないブラウザからアクセス
ここからテスト用ログ
result is false
current user is nil
login_user is nil
テスト用ログここまで

4. test1,test2ユーザ二人がログインしている場合に各々のセッションを張っているブラウザからアクセス
From test1
ここからテスト用ログ
  User Load (0.0ms)  SELECT "users".* FROM "users" WHERE "users"."id" = 2 LIMIT 1
result is true
current user email is test1@aa.bb
login_user :{}
テスト用ログここまで

From test2
ここからテスト用ログ
  User Load (0.0ms)  SELECT "users".* FROM "users" WHERE "users"."id" = 3 LIMIT 1
result is true
current user email is test2@aa.bb
login_user :{}
テスト用ログここまで

という結果になった。
まとめると。
user_signed_in?:
リクエストを発行したブラウザがログインしていない場合はfalse(他に誰がログインしていようが関係ない)
リクエストを発行したブラウザがログインしている場合はtrue

current_user:
リクエストを発行したブラウザがログインしていない(ログイン済セッションを張っていない)場合はnilが返る。
リクエストを発行したブラウザがログインしている(ログイン済セッションを張っていない)場合は、『発行ブラウザでログインしたユーザの情報のみ』が取得できる。

user_session:
常に空っぽ。
まあこれはなんにも詰めていないからだと推測できる。

ということになり、いわゆる基本的なログイン情報の取得(既にログイン済なのか、ユーザ情報はなんだっけ)に使えそうなメソッドであることがわかった。
よかったよかった。


1:          ,. -‐'''''""¨¨¨ヽ
         (.___,,,... -ァァフ|          あ…ありのまま 今 起こった事を話すぜ!
          |i i|    }! }} //|
         |l、{   j} /,,ィ//|       『おれは新しいウィンドウでログインしようと
        i|:!ヾ、_ノ/ u {:}//ヘ        思ったらいつのまにかログインしていた』
        |リ u' }  ,ノ _,!V,ハ |
       /´fト、_{ル{,ィ'eラ , タ人        ど… どういう機構なのか わからねーと思うが
     /'   ヾ|宀| {´,)⌒`/ |<ヽトiゝ        おれも何をされたのかわからなかった…
    ,゙  / )ヽ iLレ  u' | | ヾlトハ〉
     |/_/  ハ !ニ⊇ '/:}  V:::::ヽ        セッション管理がどうにかなりそうだった…
    // 二二二7'T'' /u' __ /:::::::/`ヽ
   /'´r -―一ァ‐゙T´ '"´ /::::/-‐  \    キャッシュだとかリバースプロキシだとか
   / //   广¨´  /'   /:::::/´ ̄`ヽ ⌒ヽ    そんなチャチなもんじゃあ 断じてねえ
  ノ ' /  ノ:::::`ー-、___/::::://       ヽ  }
_/`丶 /:::::::::::::::::::::::::: ̄`ー-{:::...       イ  もっと恐ろしいものの片鱗を味わったぜ…

0 件のコメント:

コメントを投稿