【发布时间】:2014-04-18 10:59:59
【问题描述】:
所以在我的 Rails 4.0 应用程序中,我使用 Devise 进行身份验证管理,我注意到当我尝试注销过期会话时出现 500 错误。我不确定问题出在哪里。我看到了许多不同的潜在来源:
1) 我不完全了解如何验证真实性令牌,但我的理解是它来自会话存储中的某些内容。在这种情况下,我的会话存储配置如下:
*config/initializers/session_store.rb*
MyApp::Application.config.session_store ActionDispatch::Session::CacheStore, :expire_after => 20.minutes
当我注销并收到此错误时,20 分钟已经过去,所以我的会话应该在缓存中过期。我不想增加这个数字,但只是为了能够退出我的会话。这似乎没有多大意义。
2) 另一种可能性是在设计的配置中。我正在使用 Devise Timeoutable 模块的默认设置,如下所示。
config/initializers/devise.rb
# ==> Configuration for :timeoutable
# The time you want to timeout the user session without activity. After this
# time the user will be asked for credentials again. Default is 30 minutes.
config.timeout_in = 30.minutes
# If true, expires auth token on session timeout.
config.expire_auth_token_on_timeout = false
我会假设 Devise 足够聪明,可以检查令牌是否已经过期,如果是,就让我通过。否则,它会尝试销毁一个 nil 会话,这同样没有任何意义。
3) 最后的可能性在于设计会话控制器本身。也许我需要这样写:
skip_before_filter :verify_authenticity_token, :only => [:destroy]
我认为这会奏效,但考虑到 Devise 是一个使用得很好的宝石,而且我不能是唯一这样做的人,这对我来说就像是一个 hack。如果我需要这样做,我会假设我做错了什么。
还有其他人遇到过这个问题吗?自从升级到 Rails 4.0(运行设计 3.2.2)后,我才遇到过这个问题。 Rails 3.2 (Running Devise ~> 3.1.0) 没有这个问题。
我主要是想避免我的用户在尝试退出无人参与的会话时看到 Server 500 错误,我正在寻找“正确”的方法来处理它。有什么想法吗?
【问题讨论】:
标签: ruby-on-rails ruby session ruby-on-rails-4 devise