【问题标题】:Devise: how can I manually set a remember_user_token cookie?设计:如何手动设置 remember_user_token cookie?
【发布时间】:2012-07-19 08:19:44
【问题描述】:

我在 rails 3.0.0 应用程序中使用 devise 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 负责的。

但是,如果我在登录时关闭浏览器并重新启动计算机,当我重新打开计算机并转到我的应用程序的 URL 时,我将不再登录。

设置此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

【问题讨论】:

    标签: ruby-on-rails cookies devise session-cookies


    【解决方案1】:

    在将用户传递给 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
    

    【讨论】:

      【解决方案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?

      【讨论】:

        【解决方案3】:

        这是我最终得到的实际代码:

        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
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-06-21
          • 2011-08-22
          • 2014-02-25
          • 1970-01-01
          相关资源
          最近更新 更多