diff --git a/CHANGELOG.rdoc b/CHANGELOG.rdoc index e3c1fc55..929b5b20 100644 --- a/CHANGELOG.rdoc +++ b/CHANGELOG.rdoc @@ -1,3 +1,6 @@ +* enhancements + * Use serialize_into_session and serialize_from_session in Warden serialize to improve extensibility + * bug fix * Properly deprecate setup_mail * Fix encoding issues with email regexp diff --git a/lib/devise/models/authenticatable.rb b/lib/devise/models/authenticatable.rb index ff1ee4b8..d682f969 100644 --- a/lib/devise/models/authenticatable.rb +++ b/lib/devise/models/authenticatable.rb @@ -82,6 +82,15 @@ module Devise module ClassMethods Devise::Models.config(self, :authentication_keys, :request_keys, :strip_whitespace_keys, :case_insensitive_keys, :http_authenticatable, :params_authenticatable) + def serialize_into_session(record) + [record.to_key, record.authenticatable_salt] + end + + def serialize_from_session(key, salt) + record = to_adapter.get(key) + record if record && record.authenticatable_salt == salt + end + def params_authenticatable?(strategy) params_authenticatable.is_a?(Array) ? params_authenticatable.include?(strategy) : params_authenticatable diff --git a/lib/devise/rails/warden_compat.rb b/lib/devise/rails/warden_compat.rb index 82041b3e..6b8a3f0d 100644 --- a/lib/devise/rails/warden_compat.rb +++ b/lib/devise/rails/warden_compat.rb @@ -15,21 +15,16 @@ end class Warden::SessionSerializer def serialize(record) - [record.class.name, record.to_key, record.authenticatable_salt] + klass = record.class + array = klass.serialize_into_session(record) + array.unshift(klass.name) end def deserialize(keys) - if keys.size == 2 - raise "Devise changed how it stores objects in session. If you are seeing this message, " << - "you can fix it by changing one character in your secret_token or cleaning up your " << - "database sessions if you are using a db store." - end - - klass, id, salt = keys + klass, *args = keys begin - record = ActiveSupport::Inflector.constantize(klass).to_adapter.get(id) - record if record && record.authenticatable_salt == salt + ActiveSupport::Inflector.constantize(klass).serialize_from_session(*args) rescue NameError => e if e.message =~ /uninitialized constant/ Rails.logger.debug "[Devise] Trying to deserialize invalid class #{klass}"