监督员如何从机架会话中获取当前用户?
问题描述:
用户登录后(ENV['warden'].authenticate!
'd)一次,warden
如何知道?除了rack.session
价值之外,我无法在cookie中找到任何内容 - 我无法从文档或代码中找出这些。监督员如何从机架会话中获取当前用户?
答
在色器件/ 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
如果你添加了一些关于你想用这段代码片段传达的信息将会很有帮助 –
你能详细说明一下这个问题吗? 'env ['rack.session']'包含这个特定用户的会话,并且包含一个'warden.user.key'或者其他东西... – mhutter
@mhutter但是服务器上存储的是哪里?这似乎是在这里统一(https://github.com/rack/rack/blob/master/lib/rack/session/cookie.rb),但我无法找到它的存储位置。似乎有两个选项:Memcached和Pooled,但找不到哪一个是默认的,哪个是在什么时候使用的。我知道它在服务器关闭后仍然存在,所以memcached? – Cenoc
你确定它会一直重新启动吗?默认是'Pool',它将数据存储在'Hash'中:https://github.com/rack/rack/blob/master/lib/rack/session/pool.rb#L33 – mhutter