【发布时间】:2013-05-14 21:44:50
【问题描述】:
我正在使用 Rails 3 和 gem devise 构建一个无状态的 RESTful API。
由于我不想存储任何会话,因此我通过在 config/initializers/session_store.rb 中定义来禁用它们:
MyApp::Application.config.session_store :disabled
我所有的 Warden Strategies(http 基本身份验证、令牌身份验证)都不存储任何信息(stored? 返回 false)。
我在我的控制器中使用助手 authenticate_user! 作为 before_filter。我在认证过程中收到以下错误:
NoMethodError (undefined method `[]' for nil:NilClass) :
warden (1.2.1) lib/warden/session_serializer.rb:32:in `fetch'
warden (1.2.1) lib/warden/proxy.rb:212:in `user'
warden (1.2.1) lib/warden/proxy.rb:318:in `_perform_authentication'
warden (1.2.1) lib/warden/proxy.rb:127:in `authenticate!'
devise (2.2.3) lib/devise/controllers/helpers.rb:48:in `authenticate_user!'
第 32 行 session_serializer 中的代码如下:
def fetch(scope)
key = session[key_for(scope)] # it crashes here
return nil unless key
method_name = "#{scope}_deserialize"
user = respond_to?(method_name) ? send(method_name, key) : deserialize(key)
delete(scope) unless user
user
end
它崩溃是因为session(即@env['rack.sessions'])等于nil(session_store 确实被禁用)。这是默认调用,尚未调用策略。
由于我不想修补补丁,我正在寻找一种在禁用 session_store 的情况下实现此目的的好方法。
谢谢
【问题讨论】:
-
您使用设计而不是简单的http身份验证的任何原因?根据我的经验,无状态 API 的设计太过分了。
-
@eabraham : 我使用了几个相当实用的设计模块(:database_authenticatable、:registerable、:validatable、:recoverable、:token_authenticatable)。
标签: ruby-on-rails session devise warden