我正在使用在 github 上找到的当前版本的 restful_authentication 并且我遇到了一堆奇怪的会话问题。服务器似乎以某种方式将会话分配给不应该的用户。这只发生在越过注销/登录障碍时。
这是一个例子。在服务器上没有活动会话的情况下,我使用用户 A 登录了一个帐户。在另一台机器上,我使用用户 B 登录。然后当注销用户 B 时,在注销重定向发生后的某个时间,我将登录为用户 A. 从这一点开始,我可以继续浏览该站点,就好像我以该用户身份登录一样!我通过日志观察到的是,当这种劫持发生时,会话 ID 是不一样的。用户 A 在两个会话中都登录了,但会话 ID 完全不同。这只是可能发生的事情的一个例子。我无法可靠地重现该问题,因为它看似随机。
它似乎不是环境或运行它的服务器的症状。我可以使用杂种和乘客重现问题。我也在开发和生产中看到了它。我在这个应用程序中使用基于 db 的会话,它在 Rails 2.1.1 上运行。我在调用生成器时应用了有状态选项。否则,没有对如何处理会话进行其他修改。
更新这里是直接来自 restful_authentication 的违规方法。
# Accesses the current user from the session.
# Future calls avoid the database because nil is not equal to false.
def current_user
@current_user ||= (login_from_session || login_from_basic_auth || login_from_cookie) unless @current_user == false
end