1

当我在我的管理界面中时,我想查看哪些用户已登录。

像这样

  • 用户名,登录?
  • 猫王,不
  • 切特贝克,不
  • 迈克尔杰克逊,没有
  • 赫比汉考克,是的
  • 贾斯汀比伯,是的
  • 使用设计,我添加了可跟踪功能

    在我的迁移中

    t.integer  :sign_in_count, :default => 0
    t.datetime :current_sign_in_at
    t.datetime :last_sign_in_at
    t.string   :current_sign_in_ip
    t.string   :last_sign_in_ip
    

    问题是,如果用户退出:current_sign_in_at并且:current_sign_in_ip未设置为零。

    我将此添加到我的 sessions_controller.rb

    def destroy
        current_user.current_sign_in_at = nil
        current_user.save
        signed_out = (Devise.sign_out_all_scopes ? sign_out : sign_out(current_user))
        set_flash_message :notice, :signed_out if signed_out
        redirect_to root_url
      end
    

    现在,current_sign_in_at当用户退出时更新。

    然后我添加了:timeoutablempdule。当会话超时时,current_sign_in_at不更新。

    在所有这些黑客攻击之后,我开始怀疑:难道没有设计一种更优雅的方式来做到这一点吗?

    4

    1 回答 1

    0

    这有点难。

    如果用户退出,很容易将 ':current_sign_in_at' 清零

    会话超时时会有点困难。当用户在超时后尝试进入时,设计会warden.logout在会话上执行一次并且用户必须再次登录。如果用户不做任何事情或只是关闭浏览器,他/她仍然登录,据服务器所知。

    要完成这项工作,我们必须: A:始终向客户端浏览器询问 env['warden'].session.last_request_at B:使用 'rake db:sessions:create' 创建会话表并将其放入session_store.rb 初始化程序。

    Squadlink::Application.config.session_store :active_record_store
    

    然后会话将在服务器上进行更好的控制。

    现在我这样做了

    配置/初始化程序/warden.rb

    Warden::Manager.before_logout do |record, warden, opts|
      if record.respond_to?(:logout_stamp!)
        record.logout_stamp!
      end
    end
    

    模型/用户.rb

    def logout_stamp!
      self.current_sign_in_at = nil
      self.current_sign_in_ip = nil
      self.save
    end
    

    并删除了

    current_user.current_sign_in_at = nil
    current_user.save
    

    行形成 session_controller destroy 动作。

    如果用户退出或退出,则“current_sign_in_at”和“current_sign_in_ip”设置为零。

    希望它可以帮助某人。

    于 2013-10-17T20:01:53.897 回答