セッションデータへのアクセス

GitLabのセッションデータはRedisに保存され、様々な方法でアクセスすることができます。

例えばウェブリクエスト中に

  • Railsはコントローラ内部からActionDispatch::Session
  • コントローラ内部からセッションにアクセスするには、Gitlab::Session を使用します。

Webリクエスト以外でも、Redisに保存されたセッションにアクセスすることは可能です。例えば

  • セッションIDと内容はRedisで直接調べることができます。
  • セッションに関連付けられた UserAgent に関するデータは、ActiveSession からアクセスできます。

セッションに値を保存するときは、次のようにするのがベストです:

  • 単純なプリミティブを使用し、マーシャリングの複雑さを避けるためにオブジェクトを保存しないようにします。
  • Redisのメモリ使用量を抑えるために、不要な変数の後始末をしましょう。

GitLab::Session

Gitlab::Session を使えば、セッションを広範囲に渡さなくてもセッションにアクセスできます。例えば、ポリシーの中で権限をチェックするときに、いちいちセッションを渡さなくてもアクセスできるようになります。

セッションは、コントローラから使用するときと同じように、ハッシュのようなインターフェイスを持っています。また、NamespacedSessionStore 、key-valueデータをハッシュに格納することもできます。

# Lookup a value stored in the current session
Gitlab::Session.current[:my_feature]

# Modify the current session stored in redis
Gitlab::Session.current[:my_feature] = value

# Store key-value data namespaced under a key
Gitlab::NamespacedSessionStore.new(:my_feature)[some_key] = value

# Set the session for a block of code, such as for tests
Gitlab::Session.with_session(my_feature: value) do
  # Code that uses Session.current[:my_feature]
end

Redis

Redisを通じてセッションデータに直接アクセスできます。これにより、デバッグ時にブラウザのセッションを確認することができます。

# Get a list of sessions
session_ids = Gitlab::Redis::Sessions.with do |redis|
  redis.smembers("#{Gitlab::Redis::Sessions::USER_SESSIONS_LOOKUP_NAMESPACE}:#{user.id}")
end

# Retrieve a specific session
session_data = Gitlab::Redis::Sessions.with { |redis| redis.get("#{Gitlab::Redis::Sessions::SESSION_NAMESPACE}:#{session_id}") }
Marshal.load(session_data)

ActiveSessionによるデバイス情報の取得

ユーザープロファイルのアクティブセッションページには、各セッションへのアクセスに使用されたデバイスに関する情報が表示されます。セッションを一覧表示するために使用されるメソッドは、開発者にとっても便利です。

# Get list of sessions for a given user
# Includes session_id and data from the UserAgent
ActiveSession.list(user)