Доступ к номеру версии сеанса в рельсах - PullRequest
0 голосов
/ 12 марта 2020

Я знаю, что после обращения к сеансу идентификатор сессии назначается рельсами. Я слышал, что если сессия модифицирована, у rails есть метка версии на сессии. Я не могу найти точную ссылку на это, кроме того, я искал способ получить доступ к номеру версии для сеанса? Я знаю, что я здесь неопределенный, но любая помощь, указав мне правильное направление, будет принята с благодарностью. Я знаю, что возможно получить доступ к идентификатору сеанса, но я более конкретно ищу доступ к номеру версии для данного идентификатора сеанса, чтобы отследить, сколько раз он был изменен.

1 Ответ

0 голосов
/ 13 марта 2020

Я знаю, что как только сеанс доступен, идентификатор сеанса назначается рельсами. Я слышал, что если сеанс изменяется, у rails есть метка версии в сеансе.

Это утверждение легко проверить на ложность, прочитав исходный код ActionDispatch::Session::CookieStore* 1007. *.

# frozen_string_literal: true
require "active_support/core_ext/hash/keys"
require "action_dispatch/middleware/session/abstract_store"
require "rack/session/cookie"

module ActionDispatch
  module Session
    # ... comments truncated for readibility
    class CookieStore < AbstractStore
      def initialize(app, options = {})
        super(app, options.merge!(cookie_only: true))
      end

      def delete_session(req, session_id, options)
        new_sid = generate_sid unless options[:drop]
        # Reset hash and Assign the new session id
        req.set_header("action_dispatch.request.unsigned_session_cookie", new_sid ? { "session_id" => new_sid } : {})
        new_sid
      end

      def load_session(req)
        stale_session_check! do
          data = unpacked_cookie_data(req)
          data = persistent_session_id!(data)
          [data["session_id"], data]
        end
      end

      private

        def extract_session_id(req)
          stale_session_check! do
            unpacked_cookie_data(req)["session_id"]
          end
        end

        def unpacked_cookie_data(req)
          req.fetch_header("action_dispatch.request.unsigned_session_cookie") do |k|
            v = stale_session_check! do
              if data = get_cookie(req)
                data.stringify_keys!
              end
              data || {}
            end
            req.set_header k, v
          end
        end

        def persistent_session_id!(data, sid = nil)
          data ||= {}
          data["session_id"] ||= sid || generate_sid
          data
        end

        def write_session(req, sid, session_data, options)
          session_data["session_id"] = sid
          session_data
        end

        def set_cookie(request, session_id, cookie)
          cookie_jar(request)[@key] = cookie
        end

        def get_cookie(req)
          cookie_jar(req)[@key]
        end

        def cookie_jar(request)
          request.cookie_jar.signed_or_encrypted
        end
    end
  end
end

Как видите, persistent_session_id! перезаписывает существующий идентификатор сеанса cook ie. Он не отслеживает предыдущие sid. Для других хранилищ, таких как сессий, memcached (dalli) и ActiveRecord, очевидно, что они явно не удаляют sid, но нет никакого вида «версий» api, как вы себе представляли.

Если вы хотели чтобы получить эту функциональность, вы должны поменять ActionDispatch :: Session :: CookieStore (или любой другой магазин, который вы используете) в стеке промежуточного программного обеспечения на свое собственное промежуточное программное обеспечение сеансов.

Вероятно, есть более простое решение для всего, что вы делаете, хотя, если его обычные вещи, такие как хранение количества пользовательских логинов (сохраните его в БД) или просмотров страниц (используйте Google Analytics или БД) или что там у вас. Кроме того, если все, что вы делаете, требует версионности - должно ли это быть на самом деле во время сеанса?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...