ruby-on-rails - 在我开始在线阅读有关它们的信息之前,这些 session 对我来说很有意义

标签 ruby-on-rails session authentication cookies ruby-on-rails-3.2

我从阅读 Sessions vs Cookies 中得到的主要信息是 Cookies 存储在客户端,而 session 存储在服务器端。如果 session 存储在服务器端,那么服务器如何知道哪个客户端是他们的?显然,某些东西必须在客户端。

每当我使用我的自滚动用户身份验证时,我都有一个 session_token我的 users 中的列数据库表。

然后,这个模块倾向于为我提供便利:

module SessionsHelper
  def current_user
    User.find_by_session_token(session[:session_token])
  end

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

  def logout_current_user!
    current_user.reset_session_token!
    session[:session_token] = nil
  end

  def require_current_user!
    redirect_to new_session_url if current_user.nil?
  end

  def require_no_current_user!
    redirect_to user_url(current_user) unless current_user.nil?
  end
end

我相信 session 存储在服务器端,它们意味着 session_token每个用户都有。此外, session 哈希必须在客户端。如果没有,它在哪里?注意,我存储用户的 session_token 是这样的:session[:session_token] = user.session_token .最后,如果我认为 session 在客户端是正确的,那么它和 session_token 是如何保持安全的?

最后,这是否与在其他框架(如 Django、php 框架等)上处理 session 的方式相同?如果不是,有哪些关键区别?

非常感谢。

最佳答案

Rails 安全指南有一些关于 session 的好信息:

http://guides.rubyonrails.org/v3.2.16/security.html#sessions

基本上, session 数据都可以存储在 cookie 中(默认),但它使用摘要进行签名,以防止使用服务器端 secret 进行篡改(但 cookie 数据在 Rails 3.2 中没有加密,只有 base64 编码,虽然我相信它是在 Rails 4 中加密的)。

另一种方法是仅将 session ID 存储在 cookie 中,而 session 数据存储在服务器上的某个位置(例如 ActiveRecord::SessionStore )。

我认为客户端/服务器端 session 选项将得到广泛支持(尤其是服务器端)。服务器端 session 存储的其他选项可以是服务器之间共享的 memcache,甚至是内存或文件存储,它们对于集群中的每个 Web 服务器都是独立的,这意味着您的负载均衡器需要支持粘性 session (以确保用户的请求都被路由到同一台服务器,因为其他服务器不知道)。如果我没记错的话,这就是过去 Apache Tomcat 在添加集群支持之前用于服务器端 session 的情况。

关于ruby-on-rails - 在我开始在线阅读有关它们的信息之前,这些 session 对我来说很有意义,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21491464/

相关文章:

ruby-on-rails - 如何在 Ruby on Rails 中创建新环境?

node.js - 使用什么身份验证策略?

php密码保护的网站

ruby-on-rails-3 - 注销不工作导轨 3.2

authentication - 如何将谷歌应用程序脚本发布到云端供公众使用?

ruby-on-rails - 安装 "nio4r": Failed to build gem native extension 时的 rails 5.0.0

ruby-on-rails - Gem::Ext::BuildError:错误:无法构建 gem native 扩展。 postgresql 和 ROR

jquery - Chrome 中的 JSON 中断按钮,IE 中的重新加载按钮(显示为裸数据)

javascript - Grails/Ext js:在不扩展 session 的情况下发出请求( session 超时)

c# - 将 session ID 存储为字符串并将其转换回 GUID