购物车与Devise - session_id登录后更改

时间:2014-04-09 19:14:08

标签: ruby-on-rails session devise shopping-cart warden

我尝试实现购物车。我将session_id存储在数据库中,以及购物车上的相关产品。登录后,我想拥有相同的会话,并能够通过访问session_id将这些产品与用户连接。但登录后,session_id似乎有所不同。我怎样才能防止这种行为(我相信Warden会这样做),或者如果它错了,我应该如何实现呢?以下是我的一些代码:

这是在过滤器

中的application_controller中
def create_session
  session_id = request.session_options[:id]
  if session_id
    session = Session.find_or_create_by_session_id(session_id)
    if session.user_id && !user_signed_in?
      session.update_attribute(:user_id, nil)
    end
  end   
end

这是在认证后过滤之前的

def update_user_session
  session_id = request.session_options[:id]
  user_id = user_signed_in? ? current_user.id : nil

  session = Session.find_by_session_id(session_id)
  if (session && session.user_id.nil?)
    Session.delete_all(user_id: user_id)
    session.update_attribute(:user_id, user_id)
  end   
end

1 个答案:

答案 0 :(得分:0)

每次登录后都需要更改会话ID。这是出于安全原因。如果您了解有关会话的更多信息,您将意识到不应在会话中存储瞬态数据。如果您需要为特定会话存储某些产品,为什么不将其存储为与该用户ID相对应而不是对应于会话ID。如果您在用户登录之前拥有购物车但希望用户在登录后可以使用购物车,则应首先将购物车存储在浏览器本地数据库中,然后在用户登录后将结果传输到服务器我希望它能回答你的问题。随意提出进一步的问题。