12
7

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

[Rails] deviseのセッション(session)はどのように決められているのか

Posted at

deviseが作成したsessionはどれだ?

devise/lib/devise/controllers/helpers.rb
https://github.com/plataformatec/devise/blob/40f02ae69baf7e9b0449aaab2aba0d0e166f77a3/lib/devise/controllers/helpers.rb

l.123
 def #{mapping}_session
   current_#{mapping} && warden.session(:#{mapping})
 end

helpers.rbの123行目には
#{mapping}_sessionとすればそのセッションを見ることができる
ということが書いてある。
(mappingは今はuserと考えておけば良い)

user_sessionを入力すると、

[16] pry(#<TopController>)> user_session
=> {"last_request_at"=>1553329704}

が返ってくる。

ちなみに先ほどのメソッドの内容から、warden.session(:user)としても同様。

[15] pry(#<TopController>)> warden.session
=> {"last_request_at"=>1553329704}

また、 session.keysと入力すると

[18] pry(#<TopController>)> session.keys
=> ["session_id", "flash", "warden.user.user.key", "warden.user.user.session"]

と返ってくるが、 session["warden.user.user.session"]としても同様に同じセッションが帰ってくる。

[19] pry(#<TopController>)> session["warden.user.user.session"]
=> {"last_request_at"=>1553329704}

てなると気になるのは、

このsessionのHashはどこで設定されているのか?

という点。

まずは wardensessionというメソッドらしきものがあるかを確認する。

warden/lib/warden/proxy.rb
https://github.com/wardencommunity/warden/blob/b7ff0f4ffacd7ad5a9b5a0191f1da0c7a64b2c2c/lib/warden/proxy.rb

l.244
  def session(scope = @config.default_scope)
    raise NotAuthenticated, "#{scope.inspect} user is not logged in" unless authenticated?(scope)
    raw_session["warden.user.#{scope}.session"] ||= {}
  end

warden/proxy.rbの244行目にsessionメソッドがあった。
ここには先ほど3番目に確認した "warden.user.user.session"という名前の命名についてのルールが書かれてある。
sessionのHashのルールについては書かれていないが、これもこれで勉強になる。


では肝心のHashについてはというと、

devise/lib/devise/hooks/timeoutable.rb
https://github.com/plataformatec/devise/blob/master/lib/devise/hooks/timeoutable.rb

l.31
  unless env['devise.skip_trackable']
    warden.session(scope)['last_request_at'] = Time.now.utc.to_i
  end

timeoutable.rbの31行目に答えが書いてあった。

Hashのkeyである last_request_atは、手入力で決められたもので、
valueは UTCでの現在時刻という変数だった。


お勉強になりました

12
7
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
12
7

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?