0

我有一个带有单个控制器的简单 Rails 应用程序。我的控制器的某些方法有一个“过滤前”,我通过查看会话对象来检查用户是否已登录:

@user = User.where(:id => session[:user_id]) if session[:user_id]

在我的控制器的“登录”方法中,我这样做:

session[:user_id] = user.id

很平常的东西。如果我从网络浏览器 (Chrome) 访问我的应用程序,一切正常。但是,当我使用 iOS 应用程序中的 NSURLRequest 访问我的 rails 应用程序时,服务器总是为每个请求创建一个新会话。它似乎永远无法识别现有会话,即使请求正在发送带有正确会话 ID 的 cookie。事实上,如果我查看我的 rails 应用程序中的“cookies”对象,我可以看到它包含会话 ID。但是,会话对象始终为空!不知道为什么服务器无法检索会话。我正在使用Passenger Phusion。有什么建议么?

4

1 回答 1

1

如果您正在POST登录您的登录页面,并且帖子不包含与会话中的令牌匹配的 CSRF 令牌,那么 Rails 将失败请求并使会话无效/重置作为安全预防措施。

要修复它,只需从会话中读取 CSRF 令牌并将其包含在您的请求中,或者关闭 CSRF 令牌检查,您可以将其放置skip_before_filter :verify_authenticity_token在控制器中以跳过 CSRF 保护检查。请注意,后一种方法确实会打开潜在的安全漏洞,因此如果它完全可行,建议包括令牌并检查它们。

于 2012-10-07T06:20:55.537 回答