因此,在我的本地主机上,登录仍然存在并且用户已登录。但是,在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_tokenbefore_save :create_remember_token
def create_remember_token self.remember_token = User.encrypt(User.new_remember_token)
任何想法都会非常感激!
答案 0 :(得分:2)
一步一步地执行您的代码:
虽然我不是100%肯定这是你的代码破解的原因(因为我看不到你写的回调),但它确实有道理。如果在您的本地环境中从头开始创建一个新用户,我认为它也会中断。我看到你为用户定义记忆令牌的唯一地方是sign_out方法 - 如果您在实现该功能时登录,退出测试并重新登录,则代码似乎可以正常工作。
可以通过使用回调设置通过回调创建用户的remember_token或sign_in方法来解决此问题。
作为旁注,如果您正在关注Hartl的会话实现,我肯定会重新审视,因为您在如何处理记忆令牌方面犯了一个相当大的错误。加密的令牌应存储在您的数据库中,未加密的令牌应存储在cookie中。然后,当使用find_by时,您应该加密该cookie以在数据库中查找用户。目前看来,你在db和cookie中保存了裸记忆令牌,这会带来安全问题。