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

120 lines
3.8 KiB
Ruby
Raw Normal View History

require 'devise/strategies/database_authenticatable'
require 'bcrypt'
2009-10-12 08:37:28 -03:00
module Devise
module Models
# Authenticatable Module, responsible for encrypting password and validating
2009-10-09 09:27:44 -03:00
# authenticity of a user while signing in.
#
2010-07-15 13:01:31 +02:00
# == Options
2009-10-20 11:55:57 -02:00
#
2010-07-15 13:01:31 +02:00
# DatabaseAuthenticable adds the following options to devise_for:
2009-10-20 11:55:57 -02:00
#
# * +stretches+: the cost given to bcrypt.
2009-11-15 03:31:13 -02:00
#
2010-07-15 13:01:31 +02:00
# == Examples
2009-10-09 09:27:44 -03:00
#
# 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
2011-04-16 12:52:59 +02:00
before_validation :downcase_keys
before_validation :strip_whitespace
end
# Generates password encryption based on the given value.
2009-10-15 15:52:25 -03:00
def password=(new_password)
@password = new_password
self.encrypted_password = password_digest(@password) if @password.present?
2009-10-15 15:52:25 -03:00
end
2011-02-15 11:33:54 +01:00
# Verifies whether an password (ie from sign in) is the user password.
def valid_password?(password)
2011-04-16 12:43:43 +02:00
return false if encrypted_password.blank?
bcrypt = ::BCrypt::Password.new(self.encrypted_password)
password = ::BCrypt::Engine.hash_secret("#{password}#{self.class.pepper}", bcrypt.salt)
Devise.secure_compare(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 = ""
2010-02-08 23:14:03 +01:00
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
2011-05-05 09:24:21 +02:00
# Update record attributes without asking for the current password. Never allow to
# change the current password
def update_without_password(params={})
params.delete(:password)
params.delete(:password_confirmation)
result = update_attributes(params)
clean_up_passwords
result
end
def after_database_authentication
end
# A reliable way to expose the salt regardless of the implementation.
def authenticatable_salt
self.encrypted_password[0,29] if self.encrypted_password
end
protected
# Downcase case-insensitive keys
def downcase_keys
2011-03-15 12:52:53 +01:00
(self.class.case_insensitive_keys || []).each { |k| self[k].try(:downcase!) }
end
def strip_whitespace
(self.class.strip_whitespace_keys || []).each { |k| self[k].try(:strip!) }
end
# Digests the password using bcrypt.
def password_digest(password)
::BCrypt::Password.create("#{password}#{self.class.pepper}", :cost => self.class.stretches).to_s
end
module ClassMethods
2010-11-20 21:19:12 +01:00
Devise::Models.config(self, :pepper, :stretches)
# We assume this method already gets the sanitized values from the
# DatabaseAuthenticatable strategy. If you are using this method on
# your own, be sure to sanitize the conditions hash to only include
# the proper fields.
def find_for_database_authentication(conditions)
find_for_authentication(conditions)
end
end
2009-09-17 09:46:40 -03:00
end
end
end