设计:可记住意味着last_sign_in_at不会被可跟踪更新

Mat*_*dan 10 authentication ruby-on-rails devise warden

我正在使用Devise,并依赖于用户模型的last_sign_in_at来计算我的客户是否在X天内没有返回.但是,我最近发现last_sign_in_at仅在实际的表单登录事件发生时更新,而不是由于包含可记住的用户而自动登录时.

如果想要确保每次用户登录时更新last_sign_in_at(新的浏览器会话),无论他们是使用表单登录还是由可记忆的cookie自动登录,我将如何在设计兼容的方式?

Kit*_*tto 15

采用Matthew的解决方案,我认为代码应该如下(注意会话之前的not-operator [:logged_signin]):

before_filter :update_last_sign_in_at

protected

def update_last_sign_in_at
  if user_signed_in? && !session[:logged_signin]
    sign_in(current_user, :force => true)
    session[:logged_signin] = true
  end
end
Run Code Online (Sandbox Code Playgroud)


Rob*_*obH 6

可跟踪的钩子来自Warden的after_set_user钩子 - 你可以做些什么来轻松解决这个问题,设置一个before_filter来调用sign_in.

这可以优化,但测试是否使用

before_filter proc{ sign_in(current_user, :force => true) }
Run Code Online (Sandbox Code Playgroud)

更新last_signed_in_at时间戳.

  • 嗨Rob,这就是我最终的目的,a)在强制sign_in之前检查用户是否已登录,以及b)确保每个会话只执行一次sign_in(强制)方法.(原谅;而不是换行符,注释不允许换行)`before_filter proc {if user_signed_in?&& session [:logged_signin]; sign_in(current_user,:force => true); session [:logged_signin] = true; 结束}` (4认同)