前回に引き続きdeviseのヘルパーメソッド(user_signed_in? ,current_user,user_session)について実際に実行して調べてみます。
ちなみに読むのがめんどい人は以下の結論
user_signed_in?:
操作してる人がログインしてればtrue、してなきゃfalse。
他の人のログイン状態とかは関係ない。
user_session:
だけ目を通してマンガ喫茶に行ってジョジョの奇妙な冒険でも読むのがいいと思います。
以下のようなコードを書いておき
ちなみに読むのがめんどい人は以下の結論
user_signed_in?:
操作してる人がログインしてればtrue、してなきゃfalse。
他の人のログイン状態とかは関係ない。
current_user:
操作している人のユーザ情報(deviseの認証につかってるやつ)がとれる。
ログインしてなきゃnil。
ムロン他の人のは取れない。
ログインしてなきゃ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 'テスト用ログここまで'
以下のようなパターンで出力させてみる。
- 誰もログインしていない場合
- test1ユーザだけがログインしている場合でそのセッションを張っているブラウザからアクセス
- test1ユーザだけがログインしている場合でそのセッションを張っていないブラウザからアクセス
- test1,test2ユーザ二人がログインしている場合に各々のセッションを張っているブラウザからアクセス
このうち3,4については同じ種類のブラウザだと、
『セッションが共有されて上手くテストができない!』*1
とか言うケースも考えられるのでchromeとFireFox2つのブラウザから試して見ることにした。
で、結果は以下。
1. 誰もログインしていない場合
ここからテスト用ログ
result is false
current user is nil
login_user is nil
テスト用ログここまで
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 :{}
テスト用ログここまで
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
テスト用ログここまで
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 :{}
テスト用ログここまで
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 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 件のコメント:
コメントを投稿