Rails 3 と gem でステートレスな RESTful API を構築していますdevise
。
セッションを保存したくないので、で定義して無効にしましたconfig/initializers/session_store.rb
:
MyApp::Application.config.session_store :disabled
すべての Warden 戦略 (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 を無効にしてこれを実現する良い方法を探しています。
ありがとう