我在rails 3.0.0 app中使用设计1.1.RC0进行用户身份验证。
由于此版本的设计存在问题,并且我们的登录过程发生在(安全)子域上,因此当用户登录时,remember_user_token
cookie未设置。这仅在涉及子域的生产中发生:应用程序将在本地测试时正确设置remember_user_token
cookie。
要解决此问题,我已调整user_sessions#create
操作以手动设置此remember_user_token
:
def create
user = User.where("lower(email) = ?", params[:user][:email].downcase).first
if user and user.valid_password?(params[:user][:password])
sign_in(:user, user)
current_user.remember_me = true if params[:user][:remember_me]
#ensure remember_user_token is set
if Rails.env.production?
cookies.signed["remember_user_token"] = {
:value => user.class.serialize_into_cookie(user),
:expires => 3.months.from_now,
:domain => ".app_name.com",
}
end
else
flash[:error] = "Login incorrect"
render :action => 'new'
end
end
这确实在生产中设置了remember_user_token
cookie。从那里,如果我使用浏览器工具删除会话cookie然后刷新页面,会话cookie会弹回并且我仍然保持登录状态 - 我认为这是remember_user_token
cookie负责的内容。
但是,如果我在登录时关闭浏览器并重新启动计算机,那么当我重新打开计算机并转到我的应用程序网址时,我将不再登录。
设置此remember_user_token
Cookie的正确方法是什么?我错过了什么?我很感激任何帮助。
这是我的session_store
初始化程序:
if Rails.env.production?
AppName::Application.config.session_store :cookie_store, :key => '_app_name_session', :domain => '.appname.com'
else
AppName::Application.config.session_store :cookie_store, :key => '_app_name_session'
end
以下是我的User
模型中的相关代码:
devise :database_authenticatable, :registerable,
:recoverable, :rememberable, :trackable, :validatable
答案 0 :(得分:2)
在将用户传递给serialize_into_cookie之前需要重新加载用户:
sign_in(:user, user)
current_user.remember_me!
#ensure remember_user_token is set
if Rails.env.production?
cookies.signed["remember_user_token"] = {
:value => user.class.serialize_into_cookie(user.reload),
:expires => 3.months.from_now,
:domain => ".app_name.com",
}
end
答案 1 :(得分:2)
@user.remember_me = true
sign_in(@user)
来源:When doing a manual sign_in for the user in Devise, how can you set remember_me to yes?
答案 2 :(得分:1)
以下是我最终得到的实际代码:
def set_current_user(user, remember_me: false)
sign_out(:user)
sign_in(:user, user)
if remember_me
user.remember_me!
cookies.signed[:remember_user_token] = {
value: user.class.serialize_into_cookie(user.reload),
expires: user.class.remember_for.from_now
}
end
end