我正在使用github上找到的当前版本的restful_authentication,我遇到了一堆奇怪的会话问题。服务器似乎以某种方式将会话分配给不应该的用户。只有在越过已登出/登录的障碍时才会发生这种情况。
这是一个例子。由于服务器上没有活动会话,我使用用户A登录帐户。在另一台计算机上,我使用用户B登录。然后在注销用户B时,在注销重定向发生后的某个时间,我将以用户A.从这一点开始,我可以继续浏览网站,就像我以该用户身份登录一样!我通过日志观察到的一点是,当发生这种劫持时,会话ID不一样。用户A在两个会话中都已登录,但会话ID完全不同。这只是可能发生的一个例子。我无法可靠地重现这个问题,因为它似乎是随机的。
它似乎不是环境或运行的服务器的症状。我可以使用杂种和乘客重现这个问题。我也在开发和生产中看到过它。我在这个应用程序中使用基于数据库的会话,它在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
答案 0 :(得分:3)
如果您(或编写restful_authentication的用户)正在缓存类变量中的当前用户,则会发生这种情况。我看过很多文章主张使用“User.current_user
”,但由于类在请求之间缓存,这会导致会话污染。
答案 1 :(得分:2)
我不知道这是否是一个答案,因为它是一个解决方案。我所做的就是切换到基于cookie的会话,一切都顺利进行。
答案 2 :(得分:0)
这个网站是否遥控?您是否在同一网络上的两台独立计算机上登录?