Какова связь между файлами cookie и объектом сеанса Rails? - PullRequest
0 голосов
/ 20 марта 2020

Этот метод запоминает пользователей, сохраняя зашифрованный повар ie в браузере пользователя:

  def remember_user
    user.remember
    cookies.permanent.encrypted[:user_id] = user.id
    cookies.permanent.encrypted[:remember_token] = user.remember_token
  end

Как следующий метод может прочитать user_id из объекта сеанса, если я его храню в печенье?

def index
    @user = User.find session[:user_id]
 end

1 Ответ

2 голосов
/ 20 марта 2020

Весь этот вопрос основан на совершенно фиктивной предпосылке, которую легко опровергнуть.

get 'cookie_monster/set_cookie'
get 'cookie_monster/eat_cookie'
class CookieMonsterController < ApplicationController
  def set_cookie
    cookies.permanent.encrypted[:x] = 999
    redirect_to action: :eat_cookie
  end

  def eat_cookie
    render plain: "session[:x] is #{session[:x].inspect} not #{ cookies.permanent.encrypted[:x] }"
  end
end
require 'test_helper'

class CookieMonsterTest < ActionDispatch::IntegrationTest
  test "the session is not the same thing as cookies.encrypted" do
    get "cookie_monster/set_cookie"
    follow_redirect!
    assert_equal "session[:x] is nil not 999", response.body
  end
end

Сеанс хранится в отдельном хранилище сеансов ie. По сути, это объект, похожий на ха sh, который сериализуется, а затем десериализуется при каждом запросе.

Когда вы делаете cookies.permanent.encrypted[:user_id], вы настраиваете совершенно другого повара ie.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...