2015-09-04 1 views
4

После того, как пользователь вошел в систему (ENV['warden'].authenticate! 'd) один раз, как warden это знаете? Я не могу найти ничего в cookie, за исключением значения rack.session - я не мог понять это из документации или кода.Как учитель получает текущего пользователя из сеанса стойки?

+0

Можете ли вы уточнить вопрос? 'env ['rack.session']' содержит сеанс для этого конкретного пользователя и содержит 'warden.user.key' или что-то еще ... – mhutter

+0

@mhutter Но где это хранится на сервере? Кажется, это Marshalled (https://github.com/rack/rack/blob/master/lib/rack/session/cookie.rb), но я не могу найти, где он хранится. Кажется, есть два варианта: Memcached и Pooled, но не могут найти, какой из них по умолчанию, и который используется, когда. Я знаю, что он сохраняется после выключения сервера, поэтому memcached? – Cenoc

+0

Вы уверены, что это повторяется при перезагрузке? По умолчанию используется «Пул», который хранит данные в «Хэш»: https://github.com/rack/rack/blob/master/lib/rack/session/pool.rb#L33 – mhutter

ответ

0

В Devise/Библиотека/Разрабатывают/Контроллеры/helpers.rb: 35

def devise_group(group_name, opts={}) 
     mappings = "[#{ opts[:contains].map { |m| ":#{m}" }.join(',') }]" 

     class_eval <<-METHODS, __FILE__, __LINE__ + 1 
     def authenticate_#{group_name}!(favourite=nil, opts={}) 
      unless #{group_name}_signed_in? 
      mappings = #{mappings} 
      mappings.unshift mappings.delete(favourite.to_sym) if favourite 
      mappings.each do |mapping| 
       opts[:scope] = mapping 
       warden.authenticate!(opts) if !devise_controller? || opts.delete(:force) 
      end 
      end 
     end 
     def #{group_name}_signed_in? 
      #{mappings}.any? do |mapping| 
      warden.authenticate?(scope: mapping) 
      end 
     end 
     def current_#{group_name}(favourite=nil) 
      mappings = #{mappings} 
      mappings.unshift mappings.delete(favourite.to_sym) if favourite 
      mappings.each do |mapping| 
      current = warden.authenticate(scope: mapping) 
      return current if current 
      end 
      nil 
     end 
     def current_#{group_name.to_s.pluralize} 
      #{mappings}.map do |mapping| 
      warden.authenticate(scope: mapping) 
      end.compact 
     end 
     helper_method "current_#{group_name}", "current_#{group_name.to_s.pluralize}", "#{group_name}_signed_in?" 
     METHODS 
    end 

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

Экспликация: метод devise_group запуска на старте сервера динамически создавая вспомогательные методы (Текущий_пользователь например), которые являются оберткой для начальника , где пользователь фактически сохранен, находится внутри метода warden.authenticate, содержание которого

def warden 
    request.env['warden'] 
    end 

а также указан в том же файле

+1

Будет полезно, если вы добавите некоторое описание того, что вы пытаетесь передать с помощью этого фрагмента кода –

Смежные вопросы