Heroku登录不会持续存在

时间:2014-02-02 06:24:50

标签: ruby-on-rails heroku

因此,在我的本地主机上,登录仍然存在并且用户已登录。但是,在Heroku上,登录后,它甚至不会识别用户仍然已登录。 在heroku日志中,它启动 - 获取登录请求 -SessionsController呈现新会话 - 用户已提交 - 发生启动会话的POST请求 - 重定向发生 - 用户登录显然未保存

- 这似乎是cookie的问题?

这是我的会话控制器

class SessionsController < ApplicationController
  def new
  end

  def create
    user = User.authenticate(params[:email], params[:password])
  if user
    session[:user_id] = user.id
    sign_in user
    redirect_to root_url, :notice => "Logged in!"
  else
    flash.now.alert = "Invalid email or password"
    render "new"
  end
  end

  def destroy
    sign_out
    redirect_to posts_url, :notice => "Logged out!"
  end


end

这是我的SessionsHelper

module SessionsHelper
        def sign_in(user)
            cookies.permanent[:remember_token] = user.remember_token
            self.current_user = user
        end

        def signed_in?
            !current_user.nil?
        end

        def current_user=(user)
            @current_user = user
        end

        def current_user
            @current_user ||= User.find_by_remember_token(cookies[:remember_token])
        end

        def current_user?(user)
            user == current_user
        end


        def is_admin?
            signed_in? ? current_user.admin : false
        end

        def sign_out
            current_user.update_attribute(:remember_token,
                                      User.encrypt(User.new_remember_token))
            cookies.delete(:remember_token)
            self.current_user = nil
        end


    end

在我的用户模型中,我在保存

之前保存了remember_token
before_save :create_remember_token
 def create_remember_token self.remember_token = User.encrypt(User.new_remember_token)

任何想法都会非常感激!

1 个答案:

答案 0 :(得分:2)

一步一步地执行您的代码:

  1. 创建的用户没有记住令牌。
  2. 正在调用sign_in方法。 Nil保存为cookie,因为用户还没有记住令牌。
  3. 您的current_user方法将@current_user设置为nil,因为User.find_by(nil)返回nil,并且不会像User.find(nil)那样引发异常。
  4. 虽然我不是100%肯定这是你的代码破解的原因(因为我看不到你写的回调),但它确实有道理。如果在您的本地环境中从头开始创建一个新用户,我认为它也会中断。我看到你为用户定义记忆令牌的唯一地方是sign_out方法 - 如果您在实现该功能时登录,退出测试并重新登录,则代码似乎可以正常工作。

    可以通过使用回调设置通过回调创建用户的remember_token或sign_in方法来解决此问题。

    作为旁注,如果您正在关注Hartl的会话实现,我肯定会重新审视,因为您在如何处理记忆令牌方面犯了一个相当大的错误。加密的令牌应存储在您的数据库中,未加密的令牌应存储在cookie中。然后,当使用find_by时,您应该加密该cookie以在数据库中查找用户。目前看来,你在db和cookie中保存了裸记忆令牌,这会带来安全问题。