app/models/user.rb
require 'digest/sha2'
class EmailValidator < ActiveModel::EachValidator
def validate_each(record, attribute, value)
record.errors.add(attribute, options[:message] || :email) unless
value =~ /\A([^@\s]+)@((?:[-a-z0-9]+\.)+[a-z]{2,})\z/i
end
end
class User < ActiveRecord::Base
include ActiveModel::Validations
attr_accessor :password_confirmation
attr_reader :password
validates :username, :presence => true, :uniqueness => true, :length => { :minimum => 2 }
validates :email, :presence => true, :uniqueness => true, :email => true
validates :password, :confirmation => true
validate :password_must_be_present
def User.authenticate(username, password)
if user = find_by_username(username)
if user.hashed_password == encrypt_password(password, user.salt)
user
end
end
end
def User.encrypt_password(password, salt)
Digest::SHA2.hexdigest(password + 'traktor' + salt)
end
def password=(password)
@password = password
if password.present?
generate_salt
self.hashed_password = self.class.encrypt_password(password, salt)
end
end
private
def password_must_be_present
errors.add(:password, "Missing password") unless hashed_password.present?
end
def generate_salt
self.salt = self.object_id.to_s + rand.to_s
end
end