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
到目前为止,我对其工作原理的理解是,每当浏览器/客户端向rails发送请求时,cookie(带有会话[:session_token])也会被发送,从而允许current_user方法查找用户.我的理解是否正确?这对我来说很奇怪,因为当我们在ApplicationController(Rails-side)中声明它时,浏览器/客户端访问会话cookie的确切方式存在差距.
解决方法
会议:
通常在动态网站中,人们会希望在HTTP请求之间存储用户数据(因为http是无状态的,否则你无法将请求与任何其他请求相关联),但是你不希望这些数据是可读的和/或可以在URL的客户端内部编辑(例如.. yourwebsite.com/yourPage?cookie=12345\u0026amp;id=678),等等…,因为您不希望客户端使用该数据没有通过您的服务器端代码.
解决这个问题的一种方法是存储数据服务器端,给它一个“session_token”(就像你所说的那样),让客户端只知道(并在每个http请求时传回)该令牌.这就是会话的实现方式.
饼干:
在Rails中实现会话的最常用技术涉及使用cookie,这些cookie是放置在用户浏览器上的小块文本.由于cookie从一个页面持续存储到下一个页面,因此它们可以存储可由应用程序用于从数据库中检索登录用户的信息(例如session_token或您想要的任何其他内容).
Where is the Session Stored in Rails?
使用上述两个概念,我现在可以告诉你Rails中的默认会话存储是CookieStore,大小约为4KB.
简而言之…
def sign_in(user) @current_user = user session[:session_token] = user.reset_token! end
然后想法是以下……
def current_user @current_user ||= User.find_by_session_token(session[:session_token]) end
…方法将从对应于会话令牌的数据库中查找并检索用户,并将其初始化为您指定的变量.
附加信息:
您还应该注意到Rails的会话和cookie帮助方法之间存在重要区别……
它们都生成cookie,但是,session […]方法会生成临时cookie,这些cookie应该在浏览器退出时到期,而cookies […]方法会创建持久性cookie,而不是.
另外,我建议你看看Ruby on Rails Security guide的第2部分.你可能会发现它很有用.
希望这可以帮助你.