simple_user_auth 0.0.2 → 0.0.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
data/README.rdoc CHANGED
@@ -6,6 +6,12 @@ In your model
6
6
  include SimpleUserAuth::Model
7
7
  authenticate_by :email # Authenticate the user by email attribute
8
8
 
9
+ This gem assumes that you have a field called encrypted_password and a field called salt in your user model.
10
+ It also creates accessors for password and current_password (for password changes).
11
+
9
12
  In ApplicationController
10
13
  include SimpleUserAuth::Controller
14
+ can_sign_in :user # uses the User model.
11
15
 
16
+ In your Gemfile
17
+ gem 'simple_user_auth', '>= 0.0.2'
@@ -1,3 +1,3 @@
1
1
  module SimpleUserAuth
2
- VERSION = "0.0.2"
2
+ VERSION = "0.0.3"
3
3
  end
@@ -2,7 +2,7 @@ module SimpleUserAuth
2
2
 
3
3
  module Model
4
4
 
5
- def self.included(klass)
5
+ def self.included(klass) # :nodoc:
6
6
  klass.extend(ClassMethods)
7
7
  klass.class_eval do
8
8
  include ClassInstanceMethods
@@ -11,16 +11,22 @@ module SimpleUserAuth
11
11
  :presence => { :if => :new_record_or_change_password? },
12
12
  :confirmation => { :if => :new_record_or_change_password? },
13
13
  :length => { :within => 6..40, :if => :new_record_or_change_password? }
14
- before_save :encrypt_password
14
+ attr_accessor :password
15
+ attr_accessor :current_password
16
+ before_save :encrypt_password
15
17
  end
16
18
  end
17
19
 
18
20
  module ClassMethods
19
21
 
22
+ # Select the database field you want to find the user by with when you use the authenticate method
23
+ # e.g. authenticate_by(:email)
20
24
  def authenticate_by(authenticator)
21
25
  write_inheritable_attribute(:authenticator, authenticator)
22
26
  end
23
27
 
28
+ # Finds the user in the database by the authenticator and verifys them against the submitted password
29
+ # e.g. User.authenticate(params[:session][:email], params[:session][:password])
24
30
  def authenticate(search, submitted_password)
25
31
  authenticator = read_inheritable_attribute(:authenticator)
26
32
  user = find(:first, :conditions => ["#{authenticator} = ?", search])
@@ -28,33 +34,37 @@ module SimpleUserAuth
28
34
  return user if user.has_password?(submitted_password)
29
35
  end
30
36
 
31
- def authenticate_with_salt(id, cookie_salt)
37
+ # Finds a user by a given id and authenticates them based on the salt stored in a cookie.
38
+ def authenticate_with_salt(id, salt)
32
39
  user = find_by_id(id)
33
- (user && user.salt == cookie_salt) ? user : nil
40
+ (user && user.salt == salt) ? user : nil
34
41
  end
35
42
 
36
43
  end
37
44
 
38
45
  module ClassInstanceMethods
39
- def change_password_validator
40
- if change_password?
41
- errors.add(:old_password, "doesn't match.") unless has_password?(current_password)
42
- end
43
- end
44
-
45
- def change_password?
46
+
47
+ def change_password? #:nodoc:
46
48
  @change_password ||= false
47
49
  end
48
50
 
51
+ # Set this to true to enable replacing encrypted_password with the password accessor. Also enables validations for passwords.
49
52
  def change_password=(bool)
50
53
  @change_password = bool
51
54
  end
52
-
55
+
56
+ # Checks to see if a user has a particular password
53
57
  def has_password?(submitted_password)
54
58
  encrypted_password == encrypt(submitted_password)
55
59
  end
56
60
 
57
61
  private
62
+
63
+ def change_password_validator
64
+ if change_password?
65
+ errors.add(:old_password, "doesn't match.") unless has_password?(current_password)
66
+ end
67
+ end
58
68
 
59
69
  def encrypt_password
60
70
  self.salt = make_salt if new_record?
@@ -81,28 +91,36 @@ module SimpleUserAuth
81
91
 
82
92
  module Controller
83
93
 
84
- def self.included(klass)
85
- klass.class_eval do
86
- include ClassMethods
94
+ def self.included(klass) # :nodoc:
95
+ klass.extend(ClassMethods)
96
+ klass.class_eval do
97
+ include ClassInstanceMethods
98
+ helper_method :current_user, :signed_in?, :not_signed_in?, :current_user?
87
99
  end
88
- ActionView::Base.send(:include, ClassMethods)
89
100
  end
90
101
 
91
102
  module ClassMethods
103
+ # The user model you'll be using. This could be useful if there were different user models for different namespaces.
104
+ # e.g. can_sign_in :user
105
+ def can_sign_in(model)
106
+ klass = Kernel.const_get(model.to_s.camelize)
107
+ write_inheritable_attribute(:user_model_for_sign_in, klass)
108
+ end
109
+ end
110
+
111
+ module ClassInstanceMethods
92
112
 
113
+ # Signs in a user, if the second parameter is false (default) the cookie will last only the session.
93
114
  def sign_in(user, remember_me = false)
94
115
  if remember_me
95
- cookies.permanent.signed[:remember_token] = [user.id, user.salt]
116
+ cookies.permanent.signed[remember_token_name] = [user.id, user.salt]
96
117
  else
97
- cookies.signed[:remember_token] = [user.id, user.salt]
118
+ cookies.signed[remember_token_name] = [user.id, user.salt]
98
119
  end
99
120
  self.current_user = user
100
121
  end
101
122
 
102
- def current_user=(user)
103
- @current_user = user
104
- end
105
-
123
+ # Returns the user object of the currently signed in user.
106
124
  def current_user
107
125
  @current_user ||= user_from_remember_token
108
126
  end
@@ -116,7 +134,7 @@ module SimpleUserAuth
116
134
  end
117
135
 
118
136
  def sign_out
119
- cookies.delete(:remember_token)
137
+ cookies.delete(remember_token_name)
120
138
  self.current_user = nil
121
139
  end
122
140
 
@@ -124,28 +142,43 @@ module SimpleUserAuth
124
142
  user == current_user
125
143
  end
126
144
 
145
+ # Stores the location of the resource trying to be accessed and redirects to signin_path
127
146
  def deny_access
128
147
  store_location
129
148
  redirect_to signin_path, :notice => "Please sign in to access this page."
130
149
  end
131
150
 
151
+ # Redirects back to the stored location, or to the value passed.
132
152
  def redirect_back_or(default)
133
153
  redirect_to(session[:return_to] || default)
134
154
  clear_return_to
135
155
  end
136
-
156
+
157
+ # This is useful as a before filter, it will deny access unless signed in.
137
158
  def authenticate
138
159
  deny_access unless signed_in?
139
160
  end
140
161
 
141
162
  private
163
+
164
+ def user_model
165
+ self.class.read_inheritable_attribute(:user_model_for_sign_in)
166
+ end
167
+
168
+ def remember_token_name
169
+ "#{user_model.name.downcase}_remember_token".to_sym
170
+ end
171
+
172
+ def current_user=(user)
173
+ @current_user = user
174
+ end
142
175
 
143
176
  def user_from_remember_token
144
- User.authenticate_with_salt(*remember_token)
177
+ user_model.authenticate_with_salt(*remember_token)
145
178
  end
146
179
 
147
180
  def remember_token
148
- cookies.signed[:remember_token] || [nil, nil]
181
+ cookies.signed[remember_token_name] || [nil, nil]
149
182
  end
150
183
 
151
184
  def store_location
metadata CHANGED
@@ -2,7 +2,7 @@
2
2
  name: simple_user_auth
3
3
  version: !ruby/object:Gem::Version
4
4
  prerelease:
5
- version: 0.0.2
5
+ version: 0.0.3
6
6
  platform: ruby
7
7
  authors:
8
8
  - Erich Menge