Rails session

什么是session

session可以存储多个请求需要共享的数据。
当你对一个页面发送请求的时候,rails服务器的response将会返回一个cookie。

Set-Cookie: ...

浏览器会保存这些cookie,直到cookie过期,当你每次发送一个请求。浏览器会把这个cookie发送到服务器。

Rails中session使用过程

服务器端

  1. 当使用session[:current_user_id] = 1赋值
  2. Rails将会创建一个session表,产生一个随机的session id。(09497d46978bf6f32265fefb5cc52264)
  3. Rails将会存储{current_user_id: 1}(Base64编码)到session的data属性中。
  4. 返回session id,然后将session id存到cookie里发送到浏览器(如果要将session存储到cookie中,rails会将data一并存储到cookie中去)

浏览器

  1. 当浏览器下次发送请求到服务器的时候会带上这个cookie,也就是session id
  2. Rails会根据session id去session表中查询出对应的session值
  3. 从记录的data属性中返回current_user_id

在Rails中默认使用Cookie保存Session信息。配置文件在config/initializers/session_store.rb中。在文件config/secrets.yml中设置了一组secret_key_base用来加密需要保护的Cookie信息,修改这个数会让存在用户浏览器的Cookie Session失效。可以用这个来强制重新登录。
也可以在这个文件中添加第三方的key或者token。可以通过Rails.application.secrets.some_api_key访问到设置的数据。


使用memcached

可以在config/environments/production中设置
config.cache_store = :mem_cache_store


使用数据库


Rails session解密


  1. 在rails中设置session
session[:current_user_id] = 12
session[:user] = "2b"
  1. 在浏览器查看
Paste_Image.png
  1. 解密cookie
require 'rubygems'
require 'cgi'
require 'active_support'
require 'action_controller'

def decrypt_session_cookie(cookie, key)
  cookie = CGI::unescape(cookie)

  # Default values for Rails 4 apps
  key_iter_num = 1000
  key_size     = 64
  salt         = "encrypted cookie"
  signed_salt  = "signed encrypted cookie"

  key_generator = ActiveSupport::KeyGenerator.new(key, iterations: key_iter_num)
  secret = key_generator.generate_key(salt)
  sign_secret = key_generator.generate_key(signed_salt)

  encryptor = ActiveSupport::MessageEncryptor.new(secret, sign_secret, serializer: ActiveSupport::MessageEncryptor::NullSerializer)
  # puts MarShal.load(encryptor.decrypt_and_verify(cookie))

  puts encryptor.decrypt_and_verify(cookie)
end


# 
cookie = 'cTI0N2R6SVc5VlFqRGtjalZobXdsWmdDeVVaajlIU3JpU052T3ZVVkp1ZEdXQ29YSGRNcGxuYmJmd2IzQUNFL0hRNGgzY0ZWOUtxR2FJU2NWc3FSZTdoU0hWQlZ6TmRjazNHN0RXV2d3N1VyeTZkSXFzaTZ0K0g1a1JpaENwTGMtLTdTUUlpeFd2ZTNvWWVYRHVvNFdPUEE9PQ%3D%3D--98bbeff308c62d37472caa84ea47af49a67b50dd'
# key是rails中secrets.yml中设置的secret_key_base
key = '9ef39555bee9dc9d2a8aa1b519ba4221ef722ed9bf248e789946cf317f5ff087d3fde1eb8c60eca6fe8b3b851c9cde2f7c318506e6b416f6938aa8203d4625e5'

decrypt_session_cookie(cookie, key)
  1. 解密后的数据
Paste_Image.png

通过解密完全得到原始数据,所以在session中千万不要存储重要的数据。也千万不要将key泄漏出去。

你可能感兴趣的:(Rails session)