监督员如何从机架会话中获取当前用户?

问题描述:

用户登录后(ENV['warden'].authenticate!'d)一次,warden如何知道?除了rack.session价值之外,我无法在cookie中找到任何内容 - 我无法从文档或代码中找出这些。监督员如何从机架会话中获取当前用户?

+0

你能详细说明一下这个问题吗? 'env ['rack.session']'包含这个特定用户的会话,并且包含一个'warden.user.key'或者其他东西... – mhutter

+0

@mhutter但是服务器上存储的是哪里?这似乎是在这里统一(https://github.com/rack/rack/blob/master/lib/rack/session/cookie.rb),但我无法找到它的存储位置。似乎有两个选项:Memcached和Pooled,但找不到哪一个是默认的,哪个是在什么时候使用的。我知道它在服务器关闭后仍然存在,所以memcached? – Cenoc

+0

你确定它会一直重新启动吗?默认是'Pool',它将数据存储在'Hash'中:https://github.com/rack/rack/blob/master/lib/rack/session/pool.rb#L33 – mhutter

在色器件/ LIB /色器件/控制器/ 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方法运行动态地创建辅助方法(CURRENT_USER例如),这是用于实际保存用户的执事012xx的包装,其内容是warden.authenticate方法内容是

def warden 
    request.env['warden'] 
    end 

也是在同一个文件中声明

+1

如果你添加了一些关于你想用这段代码片段传达的信息将会很有帮助 –