会话存储在Rails中的哪个位置?

fib*_*ono 9 cookies session ruby-on-rails

在Rails中,我已经为用户身份验证实现了以下代码(确认是正确的).但是,我想确认一下这个奇怪的想法session[:session_token].这是存储在浏览器中的"cookie"吗?

class ApplicationController < ActionController::Base
  protect_from_forgery with: :exception

  helper_method :current_user, :signed_in?

  private
  def current_user
    @current_user ||= User.find_by_session_token(session[:session_token])
  end

  def signed_in?
    !!current_user
  end

  def sign_in(user)
    @current_user = user
    session[:session_token] = user.reset_token!
  end

  def sign_out
    current_user.try(:reset_token!)
    session[:session_token] = nil
  end

  def require_signed_in!
    redirect_to new_session_url unless signed_in?
  end
end 
Run Code Online (Sandbox Code Playgroud)

到目前为止,我对其工作原理的理解是,每当浏览器/客户端向rails发送请求时,cookie(带有session[:session_token])也会被发送,从而允许该current_user方法找到用户.我的理解是否正确?这对我来说很奇怪,因为当我们在ApplicationController(Rails-side)中声明它时,浏览器/客户端访问会话cookie的确切方式存在差距.

Tim*_*dov 10

你几乎就在那里.虽然,我有一种感觉,你可能会混淆苹果和橘子......

会议:

通常在动态网站中,人们会希望在HTTP请求之间存储用户数据(因为http是无状态的,否则你无法将请求与任何其他请求相关联),但是你不希望这些数据是可读的和/或可以在URL的客户端内部编辑(例如.. yourwebsite.com/yourPage?cookie=12345&id=678),等等...,因为您不希望客户端使用该数据而不通过通过您的服务器端代码.

解决这个问题的一种方法是存储数据服务器端,给它一个"session_token"(就像你所说的那样),让客户端只知道(并在每个http请求时传回)该令牌.这就是会话的实现方式.

饼干:

在Rails中实现会话的最常用技术涉及使用cookie,这些cookie是放置在用户浏览器上的小块文本.由于cookie从一个页面持续存储到下一个页面,因此它们可以存储可由应用程序用于从数据库中检索登录用户的信息(例如session_token或您想要的任何其他内容).

会话存储在Rails中的哪个位置?

使用上述两个概念,我现在可以告诉你Rails中的默认会话存储是CookieStore,大小约为4KB.

简而言之...

def sign_in(user)
  @current_user = user
  session[:session_token] = user.reset_token!
end
Run Code Online (Sandbox Code Playgroud)

...您定义的方法将用户置于临时会话中.

然后想法是以下......

def current_user
  @current_user ||= User.find_by_session_token(session[:session_token])
end
Run Code Online (Sandbox Code Playgroud)

...方法将从对应于会话令牌的数据库中查找并检索用户,并将其初始化为您指定的变量.

附加信息:

您还应该注意到Rails sessioncookies辅助方法之间存在重要区别......

它们都生成cookie,但是,session[...]方法生成临时 cookie,它应该在浏览器退出时到期,并且cookies[...]方法创建持久性 cookie,而不是.

另外,我建议看一下Ruby on Rails安全指南的第2部分.你可能会发现它很有用.

希望这可以帮助你.