微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Authlogic gem:在会话级别而不是用户级别使用 last_request_at 列

如何解决Authlogic gem:在会话级别而不是用户级别使用 last_request_at 列

问题:如果我在两台设备(例如 A 和 B)上以同一用户身份登录,并且我在一台设备 (A) 上使用我的应用程序,而另一台设备 (B) 保持不活动状态。设备 B 在使用功能logout_on_timeout时会话到期时不会注销。

我正在尝试实现 authlogic gem 的 logout_on_timeout 功能,我成功​​实现了该功能,但问题是无论浏览器如何,authlogic 都会在每个请求中更新用户last_request_at 属性登录的设备。因此,如果我从移动设备和台式机登录同一用户,并且其中一个设备处于活动状态,那么另一台设备也会保持活动状态,因为它使用相同的共享 last_request_at来自用户属性

来自 authlogic gem 的参考代码:lib/authlogic/acts_as_authentic/logged_in_status.rb


        # Returns true if the last_request_at > logged_in_timeout.
          def logged_in?
            unless respond_to?(:last_request_at)
              raise(
                "Can not determine the records login state because " \
                  "there is no last_request_at column"
              )
            end
            !last_request_at.nil? && last_request_at > logged_in_timeout.seconds.ago
          end

那么我该如何解决这个问题呢?有没有办法在会话级别实现它?就像在 UserSession 模型中使用 last_request_at 一样。

解决方法

我决定不使用 logout_on_timeout 功能,而是使用 remember_me 功能,然后覆盖 UserSession 中的 remember_me_for 方法并设置动态值.因为 logout_on_timeout 使用 Userlast_request_at 属性值来检查会话是否超时,并且 last_request_at 在所有会话中共享,所以当一个用户在两台设备上打开一个应用程序,如果其中一个处于活动状态,则两者都将保持活动状态(可能是功能不完整或错误)。

此外,更新当前用户的 session(ActiveRecord::SessionStore::Session) 并在每次结束时使用 UserSession 的实例方法 generate_cookie_for_ Saving 生成的值更改会话的数据列值请求,因为 authlogic 仅在创建或删除 UserSession 时才更新会话。

注意:我使用 activerecord-session_store gem 在数据库中持久化会话。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。