2010-01-14 15:47:14 +01:00
|
|
|
require 'devise/strategies/rememberable'
|
|
|
|
require 'devise/hooks/rememberable'
|
2010-04-06 16:34:22 +02:00
|
|
|
require 'devise/hooks/forgetable'
|
2010-01-14 15:47:14 +01:00
|
|
|
|
2009-10-20 00:31:33 -02:00
|
|
|
module Devise
|
|
|
|
module Models
|
2009-10-20 00:52:31 -02:00
|
|
|
# Rememberable manages generating and clearing token for remember the user
|
|
|
|
# from a saved cookie. Rememberable also has utility methods for dealing
|
|
|
|
# with serializing the user into the cookie and back from the cookie, trying
|
|
|
|
# to lookup the record based on the saved information.
|
|
|
|
# You probably wouldn't use rememberable methods directly, they are used
|
|
|
|
# mostly internally for handling the remember token.
|
2009-10-22 09:49:19 -02:00
|
|
|
#
|
|
|
|
# Configuration:
|
|
|
|
#
|
|
|
|
# remember_for: the time you want the user will be remembered without
|
|
|
|
# asking for credentials. After this time the user will be
|
|
|
|
# blocked and will have to enter his credentials again.
|
|
|
|
# This configuration is also used to calculate the expires
|
|
|
|
# time for the cookie created to remember the user.
|
2009-10-22 09:54:23 -02:00
|
|
|
# By default remember_for is 2.weeks.
|
2009-10-22 09:49:19 -02:00
|
|
|
#
|
2010-06-29 20:54:19 -05:00
|
|
|
# remember_across_browsers: if a valid remember token can be re-used
|
|
|
|
# between multiple browsers.
|
|
|
|
# By default remember_across_browsers is true.
|
|
|
|
#
|
2009-10-20 00:52:31 -02:00
|
|
|
# Examples:
|
|
|
|
#
|
|
|
|
# User.find(1).remember_me! # regenerating the token
|
|
|
|
# User.find(1).forget_me! # clearing the token
|
2009-10-20 08:44:21 -02:00
|
|
|
#
|
2009-10-20 00:52:31 -02:00
|
|
|
# # generating info to put into cookies
|
|
|
|
# User.serialize_into_cookie(user)
|
2009-10-20 08:44:21 -02:00
|
|
|
#
|
2009-10-20 00:52:31 -02:00
|
|
|
# # lookup the user based on the incoming cookie information
|
|
|
|
# User.serialize_from_cookie(cookie_string)
|
2009-10-20 00:31:33 -02:00
|
|
|
module Rememberable
|
2010-02-17 12:35:38 +01:00
|
|
|
extend ActiveSupport::Concern
|
2009-10-20 00:31:33 -02:00
|
|
|
|
2010-02-17 12:35:38 +01:00
|
|
|
included do
|
|
|
|
# Remember me option available in after_authentication hook.
|
|
|
|
attr_accessor :remember_me
|
2009-10-20 00:31:33 -02:00
|
|
|
end
|
|
|
|
|
2010-06-29 20:54:19 -05:00
|
|
|
# Generate a new remember token and save the record without validations
|
|
|
|
# unless remember_across_browsers is true and the user already has a valid token.
|
2009-10-20 00:31:33 -02:00
|
|
|
def remember_me!
|
2010-06-29 20:54:19 -05:00
|
|
|
return if self.class.remember_across_browsers && self.remember_created_at && !self.remember_expired?
|
2009-11-18 09:26:47 -02:00
|
|
|
self.remember_token = Devise.friendly_token
|
2009-11-02 23:14:27 -02:00
|
|
|
self.remember_created_at = Time.now.utc
|
2010-02-16 14:31:49 +01:00
|
|
|
save(:validate => false)
|
2009-10-20 00:31:33 -02:00
|
|
|
end
|
|
|
|
|
|
|
|
# Removes the remember token only if it exists, and save the record
|
|
|
|
# without validations.
|
|
|
|
def forget_me!
|
2009-11-22 00:24:34 -02:00
|
|
|
if remember_token
|
2009-10-20 00:31:33 -02:00
|
|
|
self.remember_token = nil
|
2009-10-22 09:09:34 -02:00
|
|
|
self.remember_created_at = nil
|
2010-02-16 14:31:49 +01:00
|
|
|
save(:validate => false)
|
2009-10-20 00:31:33 -02:00
|
|
|
end
|
|
|
|
end
|
|
|
|
|
2009-10-22 09:09:34 -02:00
|
|
|
# Remember token should be expired if expiration time not overpass now.
|
|
|
|
def remember_expired?
|
2009-11-02 23:14:27 -02:00
|
|
|
remember_expires_at <= Time.now.utc
|
2009-10-22 09:09:34 -02:00
|
|
|
end
|
|
|
|
|
|
|
|
# Remember token expires at created time + remember_for configuration
|
|
|
|
def remember_expires_at
|
2009-11-22 22:32:54 -02:00
|
|
|
remember_created_at + self.class.remember_for
|
2009-10-20 00:31:33 -02:00
|
|
|
end
|
2010-01-14 13:38:02 +01:00
|
|
|
|
2010-05-05 18:25:59 +01:00
|
|
|
def cookie_domain
|
|
|
|
self.class.cookie_domain
|
|
|
|
end
|
|
|
|
|
|
|
|
def cookie_domain?
|
|
|
|
self.class.cookie_domain != false
|
|
|
|
end
|
|
|
|
|
2010-01-14 13:38:02 +01:00
|
|
|
module ClassMethods
|
|
|
|
# Create the cookie key using the record id and remember_token
|
|
|
|
def serialize_into_cookie(record)
|
2010-03-31 13:31:45 +02:00
|
|
|
[record.id, record.remember_token]
|
2010-01-14 13:38:02 +01:00
|
|
|
end
|
|
|
|
|
|
|
|
# Recreate the user based on the stored cookie
|
2010-03-31 13:31:45 +02:00
|
|
|
def serialize_from_cookie(id, remember_token)
|
|
|
|
conditions = { :id => id, :remember_token => remember_token }
|
|
|
|
record = find(:first, :conditions => conditions)
|
|
|
|
record if record && !record.remember_expired?
|
2010-01-14 13:38:02 +01:00
|
|
|
end
|
|
|
|
|
2010-06-29 20:54:19 -05:00
|
|
|
Devise::Models.config(self, :remember_for, :remember_across_browsers, :cookie_domain)
|
2010-01-14 13:38:02 +01:00
|
|
|
end
|
2009-10-20 00:31:33 -02:00
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|