1 | require 'digest/sha1' |
---|
2 | class <%= class_name %> < ActiveRecord::Base |
---|
3 | # Virtual attribute for the unencrypted password |
---|
4 | attr_accessor :password |
---|
5 | |
---|
6 | validates_presence_of :login, :email |
---|
7 | validates_presence_of :password, :if => :password_required? |
---|
8 | validates_presence_of :password_confirmation, :if => :password_required? |
---|
9 | validates_length_of :password, :within => 4..40, :if => :password_required? |
---|
10 | validates_confirmation_of :password, :if => :password_required? |
---|
11 | validates_length_of :login, :within => 3..40 |
---|
12 | validates_length_of :email, :within => 3..100 |
---|
13 | validates_uniqueness_of :login, :email, :case_sensitive => false |
---|
14 | before_save :encrypt_password |
---|
15 | |
---|
16 | # Authenticates a user by their login name and unencrypted password. Returns the user or nil. |
---|
17 | def self.authenticate(login, password) |
---|
18 | u = find_by_login(login) # need to get the salt |
---|
19 | u && u.authenticated?(password) ? u : nil |
---|
20 | end |
---|
21 | |
---|
22 | # Encrypts some data with the salt. |
---|
23 | def self.encrypt(password, salt) |
---|
24 | Digest::SHA1.hexdigest("--#{salt}--#{password}--") |
---|
25 | end |
---|
26 | |
---|
27 | # Encrypts the password with the user salt |
---|
28 | def encrypt(password) |
---|
29 | self.class.encrypt(password, salt) |
---|
30 | end |
---|
31 | |
---|
32 | def authenticated?(password) |
---|
33 | crypted_password == encrypt(password) |
---|
34 | end |
---|
35 | |
---|
36 | def remember_token? |
---|
37 | remember_token_expires_at && Time.now.utc < remember_token_expires_at |
---|
38 | end |
---|
39 | |
---|
40 | # These create and unset the fields required for remembering users between browser closes |
---|
41 | def remember_me |
---|
42 | self.remember_token_expires_at = 2.weeks.from_now.utc |
---|
43 | self.remember_token = encrypt("#{email}--#{remember_token_expires_at}") |
---|
44 | save(false) |
---|
45 | end |
---|
46 | |
---|
47 | def forget_me |
---|
48 | self.remember_token_expires_at = nil |
---|
49 | self.remember_token = nil |
---|
50 | save(false) |
---|
51 | end |
---|
52 | |
---|
53 | protected |
---|
54 | # before filter |
---|
55 | def encrypt_password |
---|
56 | return if password.blank? |
---|
57 | self.salt = Digest::SHA1.hexdigest("--#{Time.now.to_s}--#{login}--") if new_record? |
---|
58 | self.crypted_password = encrypt(password) |
---|
59 | end |
---|
60 | |
---|
61 | def password_required? |
---|
62 | crypted_password.blank? || !password.blank? |
---|
63 | end |
---|
64 | end |
---|