rubyonrails: как найти сессию по session_id

Asked
Viewd737

0

кто-нибудь знает, как найти сеанс по session_id в RoR? Я использую Authlogic в своем проекте, я не знаю, коррелирует ли это

1 ответов

1

Мне не приходилось делать это самому, и я не совсем понимаю, зачем кому-то это нужно.

Просматривая исходный код, я вижу, что есть способ сделать это.

В модуле Authlogic :: Session :: Persistence есть метод поиска. Вы можете вызвать этот метод с помощью UserSession.find, и, похоже, он имеет возможность поиска на основе session_id

     # This is how you persist a session. This finds the record for the current session using
    # a variety of methods. It basically tries to "log in" the user without the user having
    # to explicitly log in. Check out the other Authlogic::Session modules for more information.
    #
    # The best way to use this method is something like:
    #
    # helper_method :current_user_session, :current_user
    #
    # def current_user_session
    # return @current_user_session if defined?(@current_user_session)
    # @current_user_session = UserSession.find
    # end
    #
    # def current_user
    # return @current_user if defined?(@current_user)
    # @current_user = current_user_session && current_user_session.user
    # end
    #
    # Also, this method accepts a single parameter as the id, to find session that you marked with an id:
    #
    # UserSession.find(:secure)
    #
    # See the id method for more information on ids.
    def find(id = nil, priority_record = nil)
      session = new({:priority_record => priority_record}, id)
      session.priority_record = priority_record
      if session.persisting?
        session
      else
        nil
      end
    end
  end
 

Документация по этому методу относится к классу Authlogic :: Session.

В Authlogic :: Session :: Session :: Config говорится, что ключ сеанса может быть ключом cookie, строкой или символом.

   module Config
    # Works exactly like cookie_key, but for sessions. See cookie_key for more info.
    #
    # * <tt>Default:</tt> cookie_key
    # * <tt>Accepts:</tt> Symbol or String
    def session_key(value = nil)
      rw_config(:session_key, value, cookie_key)
    end
    alias_method :session_key=, :session_key
  end
 

Итак, в следующем методе, который пытается найти текущий сеанс, мы видим, что если record_id не равно нулю, то выполняется поиск сеанса с использованием этого ключа.

       def persist_by_session
        persistence_token, record_id = session_credentials
        if !persistence_token.nil?
          # Allow finding by persistence token, because when records are created the session is maintained in a before_save, when there is no id.
          # This is done for performance reasons and to save on queries.
          record = record_id.nil? ?
            search_for_record("find_by_persistence_token", persistence_token) :
            search_for_record("find_by_#{klass.primary_key}", record_id)
          self.unauthorized_record = record if record && record.persistence_token == persistence_token
          valid?
        else
          false
        end
      end
 

record_id создается с помощью метода session_credentials. Кажется, что создается сеансовый ключ на основе ключа, предоставленного контроллеру

       def session_credentials
        [controller.session[session_key], controller.session["#{session_key}_#{klass.primary_key}"]].compact
      end

      def session_key
        build_key(self.class.session_key)
      end
 

Большую часть этого я собрал, просмотрев исходный код на Github . Если вам нужна дополнительная помощь, возможно, это лучшее место для начала поиска.

Надеюсь, это поможет