1
0
Fork 0
mirror of https://github.com/heartcombo/devise.git synced 2022-11-09 12:18:31 -05:00
heartcombo--devise/lib/devise/models/database_authenticatable.rb

103 lines
3.4 KiB
Ruby
Raw Normal View History

require 'devise/strategies/database_authenticatable'
2009-10-12 08:37:28 -03:00
module Devise
module Models
2009-10-09 09:27:44 -03:00
# Authenticable Module, responsible for encrypting password and validating
# authenticity of a user while signing in.
#
# Configuration:
2009-10-20 11:55:57 -02:00
#
# You can overwrite configuration values by setting in globally in Devise,
# using devise method or overwriting the respective instance method.
#
2009-10-09 09:27:44 -03:00
# pepper: encryption key used for creating encrypted password. Each time
# password changes, it's gonna be encrypted again, and this key
# is added to the password and salt to create a secure hash.
2009-10-20 11:55:57 -02:00
# Always use `rake secret' to generate a new key.
2009-10-15 15:52:25 -03:00
#
2009-10-09 09:27:44 -03:00
# stretches: defines how many times the password will be encrypted.
#
2009-11-15 03:31:13 -02:00
# encryptor: the encryptor going to be used. By default :sha1.
#
2009-10-09 09:27:44 -03:00
# Examples:
#
# User.find(1).valid_password?('password123') # returns true/false
2009-10-20 11:55:57 -02:00
#
module DatabaseAuthenticatable
extend ActiveSupport::Concern
2010-02-17 12:35:38 +01:00
included do
attr_reader :password, :current_password
attr_accessor :password_confirmation
end
# Regenerates password salt and encrypted password each time password is set,
# and then trigger any "after_changed_password"-callbacks.
2009-10-15 15:52:25 -03:00
def password=(new_password)
@password = new_password
if @password.present?
self.password_salt = self.class.encryptor_class.salt
self.encrypted_password = password_digest(@password)
end
2009-10-15 15:52:25 -03:00
end
2009-12-15 01:20:59 +01:00
# Verifies whether an incoming_password (ie from sign in) is the user password.
def valid_password?(incoming_password)
password_digest(incoming_password) == self.encrypted_password
end
2010-02-08 23:14:03 +01:00
# Set password and password confirmation to nil
def clean_up_passwords
self.password = self.password_confirmation = nil
end
# Update record attributes when :current_password matches, otherwise returns
# error on :current_password. It also automatically rejects :password and
# :password_confirmation if they are blank.
def update_with_password(params={})
current_password = params.delete(:current_password)
2010-02-08 20:38:47 +01:00
if params[:password].blank?
params.delete(:password)
params.delete(:password_confirmation) if params[:password_confirmation].blank?
end
2010-02-08 23:14:03 +01:00
result = if valid_password?(current_password)
update_attributes(params)
else
self.errors.add(:current_password, current_password.blank? ? :blank : :invalid)
self.attributes = params
false
end
2010-02-08 23:14:03 +01:00
clean_up_passwords
2010-02-08 23:14:03 +01:00
result
end
def after_database_authentication
end
protected
# Digests the password using the configured encryptor.
def password_digest(password)
self.class.encryptor_class.digest(password, self.class.stretches, self.password_salt, self.class.pepper)
end
module ClassMethods
Devise::Models.config(self, :pepper, :stretches, :encryptor)
# Returns the class for the configured encryptor.
def encryptor_class
@encryptor_class ||= ::Devise::Encryptors.const_get(encryptor.to_s.classify)
end
def find_for_database_authentication(conditions)
find_for_authentication(conditions)
end
end
2009-09-17 09:46:40 -03:00
end
end
end