authem 0.0.2 → 1.0.0.rc1
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.markdown +1 -1
- data/Rakefile +1 -4
- data/lib/authem.rb +4 -1
- data/lib/authem/base_user.rb +45 -0
- data/lib/authem/controller_support.rb +14 -32
- data/lib/authem/sorcery_user.rb +21 -0
- data/lib/authem/user.rb +10 -0
- data/lib/authem/version.rb +1 -1
- metadata +143 -93
- data/lib/authem/model.rb +0 -44
data/README.markdown
CHANGED
@@ -4,7 +4,7 @@ Authem is an authentication library for Ruby web applications.
|
|
4
4
|
|
5
5
|
## Compatibility
|
6
6
|
|
7
|
-
Authem is tested against Ruby 1.
|
7
|
+
Authem is tested against Ruby 1.9.2, 1.9.3, Rubinius
|
8
8
|
|
9
9
|
[](http://travis-ci.org/paulelliott/authem)
|
10
10
|
|
data/Rakefile
CHANGED
data/lib/authem.rb
CHANGED
@@ -1,7 +1,10 @@
|
|
1
1
|
module Authem
|
2
|
+
autoload :BaseUser, 'authem/base_user'
|
3
|
+
autoload :User, 'authem/user'
|
4
|
+
autoload :SorceryUser, 'authem/sorcery_user'
|
5
|
+
|
2
6
|
autoload :Config, 'authem/config'
|
3
7
|
autoload :ControllerSupport, 'authem/controller_support'
|
4
|
-
autoload :Model, 'authem/model'
|
5
8
|
autoload :Token, 'authem/token'
|
6
9
|
|
7
10
|
def self.configure(&block)
|
@@ -0,0 +1,45 @@
|
|
1
|
+
require 'bcrypt'
|
2
|
+
|
3
|
+
module Authem::BaseUser
|
4
|
+
extend ::ActiveSupport::Concern
|
5
|
+
|
6
|
+
included do
|
7
|
+
attr_accessible :email, :password, :password_confirmation
|
8
|
+
|
9
|
+
validates_uniqueness_of :email
|
10
|
+
validates_format_of :email, with: /^\S+@\S+$/
|
11
|
+
validates_presence_of :password, on: :create
|
12
|
+
validates_confirmation_of :password, message: 'should match confirmation'
|
13
|
+
|
14
|
+
def self.find_by_email(email)
|
15
|
+
where("LOWER(email) = ?", email.downcase).first
|
16
|
+
end
|
17
|
+
|
18
|
+
def remember_token
|
19
|
+
self[:remember_token] || generate_token(:remember)
|
20
|
+
end
|
21
|
+
|
22
|
+
def session_token
|
23
|
+
self[:session_token] || generate_token(:session)
|
24
|
+
end
|
25
|
+
|
26
|
+
def reset_password(password, confirmation)
|
27
|
+
return false unless password.present?
|
28
|
+
|
29
|
+
self.password = password
|
30
|
+
self.password_confirmation = confirmation
|
31
|
+
self.reset_password_token = nil
|
32
|
+
save
|
33
|
+
end
|
34
|
+
|
35
|
+
def reset_password_token!
|
36
|
+
generate_token(:reset_password)
|
37
|
+
end
|
38
|
+
|
39
|
+
private
|
40
|
+
|
41
|
+
def generate_token(type)
|
42
|
+
Authem::Token.generate.tap { |token| update_column("#{type}_token", token) }
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
@@ -3,34 +3,25 @@ module Authem::ControllerSupport
|
|
3
3
|
|
4
4
|
protected
|
5
5
|
|
6
|
-
def sign_in(
|
7
|
-
|
8
|
-
|
9
|
-
end
|
10
|
-
if email_or_user.is_a? Authem::Model
|
11
|
-
establish_presence(email_or_user)
|
12
|
-
remember_me! if remember_me
|
13
|
-
email_or_user
|
14
|
-
end
|
6
|
+
def sign_in(user, remember_me=true)
|
7
|
+
cookies.permanent.signed[:remember_token] = user.remember_token if remember_me
|
8
|
+
session[:session_token] = user.session_token
|
15
9
|
end
|
16
10
|
|
17
11
|
def sign_out
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
def remember_me!
|
22
|
-
cookies.permanent.signed[:remember_me] = current_user.id
|
12
|
+
cookies[:remember_token] = nil
|
13
|
+
reset_session
|
14
|
+
@current_user = nil
|
23
15
|
end
|
24
16
|
|
25
17
|
def current_user
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
establish_presence(user) if user
|
18
|
+
if session[:session_token]
|
19
|
+
Authem::Config.user_class.where(session_token: session[:session_token].to_s).first
|
20
|
+
elsif cookies[:remember_token].present?
|
21
|
+
Authem::Config.user_class.where(remember_token: cookies.signed[:remember_token].to_s).first.tap do |user|
|
22
|
+
session[:session_token] = user.session_token if user
|
32
23
|
end
|
33
|
-
|
24
|
+
end
|
34
25
|
end
|
35
26
|
|
36
27
|
def require_user
|
@@ -40,12 +31,8 @@ module Authem::ControllerSupport
|
|
40
31
|
end
|
41
32
|
end
|
42
33
|
|
43
|
-
def
|
44
|
-
|
45
|
-
clear_session
|
46
|
-
session[:return_to_url] = return_to_url
|
47
|
-
session[:user_id] = user.id
|
48
|
-
@current_user = user
|
34
|
+
def signed_in?
|
35
|
+
current_user.present?
|
49
36
|
end
|
50
37
|
|
51
38
|
def redirect_back_or_to(url, flash_hash = {})
|
@@ -54,11 +41,6 @@ module Authem::ControllerSupport
|
|
54
41
|
redirect_to(url, :flash => flash_hash)
|
55
42
|
end
|
56
43
|
|
57
|
-
def clear_session
|
58
|
-
cookies[:remember_me] = nil
|
59
|
-
reset_session
|
60
|
-
end
|
61
|
-
|
62
44
|
included do
|
63
45
|
helper_method :current_user
|
64
46
|
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
module Authem::SorceryUser
|
2
|
+
extend ::ActiveSupport::Concern
|
3
|
+
include Authem::BaseUser
|
4
|
+
|
5
|
+
included do
|
6
|
+
attr_accessor :password, :password_confirmation
|
7
|
+
|
8
|
+
before_save :encrypt_password
|
9
|
+
|
10
|
+
def authenticate(password)
|
11
|
+
self if crypted_password.present? && ::BCrypt::Password.new(crypted_password) == [password, salt].join
|
12
|
+
end
|
13
|
+
|
14
|
+
def encrypt_password
|
15
|
+
if password.present?
|
16
|
+
self.salt = ::BCrypt::Engine.generate_salt
|
17
|
+
self.crypted_password = ::BCrypt::Password.create([password, salt].join)
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
data/lib/authem/user.rb
ADDED
data/lib/authem/version.rb
CHANGED
metadata
CHANGED
@@ -1,119 +1,173 @@
|
|
1
|
-
--- !ruby/object:Gem::Specification
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
2
|
name: authem
|
3
|
-
version: !ruby/object:Gem::Version
|
4
|
-
|
5
|
-
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 1.0.0.rc1
|
5
|
+
prerelease: 6
|
6
6
|
platform: ruby
|
7
|
-
authors:
|
7
|
+
authors:
|
8
8
|
- Paul Elliott
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
- !ruby/object:Gem::Dependency
|
12
|
+
date: 2012-08-22 00:00:00.000000000 Z
|
13
|
+
dependencies:
|
14
|
+
- !ruby/object:Gem::Dependency
|
16
15
|
name: activesupport
|
17
|
-
|
18
|
-
requirement: &id001 !ruby/object:Gem::Requirement
|
16
|
+
requirement: !ruby/object:Gem::Requirement
|
19
17
|
none: false
|
20
|
-
requirements:
|
21
|
-
- -
|
22
|
-
- !ruby/object:Gem::Version
|
23
|
-
version:
|
18
|
+
requirements:
|
19
|
+
- - ! '>='
|
20
|
+
- !ruby/object:Gem::Version
|
21
|
+
version: '0'
|
24
22
|
type: :runtime
|
25
|
-
version_requirements: *id001
|
26
|
-
- !ruby/object:Gem::Dependency
|
27
|
-
name: bcrypt-ruby
|
28
23
|
prerelease: false
|
29
|
-
|
24
|
+
version_requirements: !ruby/object:Gem::Requirement
|
25
|
+
none: false
|
26
|
+
requirements:
|
27
|
+
- - ! '>='
|
28
|
+
- !ruby/object:Gem::Version
|
29
|
+
version: '0'
|
30
|
+
- !ruby/object:Gem::Dependency
|
31
|
+
name: bcrypt-ruby
|
32
|
+
requirement: !ruby/object:Gem::Requirement
|
30
33
|
none: false
|
31
|
-
requirements:
|
32
|
-
- -
|
33
|
-
- !ruby/object:Gem::Version
|
34
|
-
version:
|
34
|
+
requirements:
|
35
|
+
- - ! '>='
|
36
|
+
- !ruby/object:Gem::Version
|
37
|
+
version: '0'
|
35
38
|
type: :runtime
|
36
|
-
version_requirements: *id002
|
37
|
-
- !ruby/object:Gem::Dependency
|
38
|
-
name: actionpack
|
39
39
|
prerelease: false
|
40
|
-
|
40
|
+
version_requirements: !ruby/object:Gem::Requirement
|
41
|
+
none: false
|
42
|
+
requirements:
|
43
|
+
- - ! '>='
|
44
|
+
- !ruby/object:Gem::Version
|
45
|
+
version: '0'
|
46
|
+
- !ruby/object:Gem::Dependency
|
47
|
+
name: actionpack
|
48
|
+
requirement: !ruby/object:Gem::Requirement
|
41
49
|
none: false
|
42
|
-
requirements:
|
43
|
-
- -
|
44
|
-
- !ruby/object:Gem::Version
|
45
|
-
version:
|
50
|
+
requirements:
|
51
|
+
- - ! '>='
|
52
|
+
- !ruby/object:Gem::Version
|
53
|
+
version: '0'
|
46
54
|
type: :development
|
47
|
-
version_requirements: *id003
|
48
|
-
- !ruby/object:Gem::Dependency
|
49
|
-
name: activerecord
|
50
55
|
prerelease: false
|
51
|
-
|
56
|
+
version_requirements: !ruby/object:Gem::Requirement
|
57
|
+
none: false
|
58
|
+
requirements:
|
59
|
+
- - ! '>='
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '0'
|
62
|
+
- !ruby/object:Gem::Dependency
|
63
|
+
name: activerecord
|
64
|
+
requirement: !ruby/object:Gem::Requirement
|
52
65
|
none: false
|
53
|
-
requirements:
|
54
|
-
- -
|
55
|
-
- !ruby/object:Gem::Version
|
56
|
-
version:
|
66
|
+
requirements:
|
67
|
+
- - ! '>='
|
68
|
+
- !ruby/object:Gem::Version
|
69
|
+
version: '0'
|
57
70
|
type: :development
|
58
|
-
version_requirements: *id004
|
59
|
-
- !ruby/object:Gem::Dependency
|
60
|
-
name: database_cleaner
|
61
71
|
prerelease: false
|
62
|
-
|
72
|
+
version_requirements: !ruby/object:Gem::Requirement
|
73
|
+
none: false
|
74
|
+
requirements:
|
75
|
+
- - ! '>='
|
76
|
+
- !ruby/object:Gem::Version
|
77
|
+
version: '0'
|
78
|
+
- !ruby/object:Gem::Dependency
|
79
|
+
name: database_cleaner
|
80
|
+
requirement: !ruby/object:Gem::Requirement
|
63
81
|
none: false
|
64
|
-
requirements:
|
65
|
-
- -
|
66
|
-
- !ruby/object:Gem::Version
|
67
|
-
version:
|
82
|
+
requirements:
|
83
|
+
- - ! '>='
|
84
|
+
- !ruby/object:Gem::Version
|
85
|
+
version: '0'
|
68
86
|
type: :development
|
69
|
-
version_requirements: *id005
|
70
|
-
- !ruby/object:Gem::Dependency
|
71
|
-
name: rake
|
72
87
|
prerelease: false
|
73
|
-
|
88
|
+
version_requirements: !ruby/object:Gem::Requirement
|
89
|
+
none: false
|
90
|
+
requirements:
|
91
|
+
- - ! '>='
|
92
|
+
- !ruby/object:Gem::Version
|
93
|
+
version: '0'
|
94
|
+
- !ruby/object:Gem::Dependency
|
95
|
+
name: rake
|
96
|
+
requirement: !ruby/object:Gem::Requirement
|
74
97
|
none: false
|
75
|
-
requirements:
|
76
|
-
- -
|
77
|
-
- !ruby/object:Gem::Version
|
78
|
-
version:
|
98
|
+
requirements:
|
99
|
+
- - ! '>='
|
100
|
+
- !ruby/object:Gem::Version
|
101
|
+
version: '0'
|
79
102
|
type: :development
|
80
|
-
version_requirements: *id006
|
81
|
-
- !ruby/object:Gem::Dependency
|
82
|
-
name: rspec
|
83
103
|
prerelease: false
|
84
|
-
|
104
|
+
version_requirements: !ruby/object:Gem::Requirement
|
85
105
|
none: false
|
86
|
-
requirements:
|
87
|
-
- -
|
88
|
-
- !ruby/object:Gem::Version
|
89
|
-
version:
|
106
|
+
requirements:
|
107
|
+
- - ! '>='
|
108
|
+
- !ruby/object:Gem::Version
|
109
|
+
version: '0'
|
110
|
+
- !ruby/object:Gem::Dependency
|
111
|
+
name: rspec
|
112
|
+
requirement: !ruby/object:Gem::Requirement
|
113
|
+
none: false
|
114
|
+
requirements:
|
115
|
+
- - ! '>='
|
116
|
+
- !ruby/object:Gem::Version
|
117
|
+
version: '0'
|
90
118
|
type: :development
|
91
|
-
|
92
|
-
|
119
|
+
prerelease: false
|
120
|
+
version_requirements: !ruby/object:Gem::Requirement
|
121
|
+
none: false
|
122
|
+
requirements:
|
123
|
+
- - ! '>='
|
124
|
+
- !ruby/object:Gem::Version
|
125
|
+
version: '0'
|
126
|
+
- !ruby/object:Gem::Dependency
|
93
127
|
name: pg
|
128
|
+
requirement: !ruby/object:Gem::Requirement
|
129
|
+
none: false
|
130
|
+
requirements:
|
131
|
+
- - ! '>='
|
132
|
+
- !ruby/object:Gem::Version
|
133
|
+
version: '0'
|
134
|
+
type: :development
|
94
135
|
prerelease: false
|
95
|
-
|
136
|
+
version_requirements: !ruby/object:Gem::Requirement
|
96
137
|
none: false
|
97
|
-
requirements:
|
98
|
-
- -
|
99
|
-
- !ruby/object:Gem::Version
|
100
|
-
version:
|
138
|
+
requirements:
|
139
|
+
- - ! '>='
|
140
|
+
- !ruby/object:Gem::Version
|
141
|
+
version: '0'
|
142
|
+
- !ruby/object:Gem::Dependency
|
143
|
+
name: pry
|
144
|
+
requirement: !ruby/object:Gem::Requirement
|
145
|
+
none: false
|
146
|
+
requirements:
|
147
|
+
- - ! '>='
|
148
|
+
- !ruby/object:Gem::Version
|
149
|
+
version: '0'
|
101
150
|
type: :development
|
102
|
-
|
151
|
+
prerelease: false
|
152
|
+
version_requirements: !ruby/object:Gem::Requirement
|
153
|
+
none: false
|
154
|
+
requirements:
|
155
|
+
- - ! '>='
|
156
|
+
- !ruby/object:Gem::Version
|
157
|
+
version: '0'
|
103
158
|
description: Authem provides a simple solution for email-based authentication.
|
104
|
-
email:
|
159
|
+
email:
|
105
160
|
- paul@hashrocket.com
|
106
161
|
executables: []
|
107
|
-
|
108
162
|
extensions: []
|
109
|
-
|
110
163
|
extra_rdoc_files: []
|
111
|
-
|
112
|
-
|
164
|
+
files:
|
165
|
+
- lib/authem/base_user.rb
|
113
166
|
- lib/authem/config.rb
|
114
167
|
- lib/authem/controller_support.rb
|
115
|
-
- lib/authem/
|
168
|
+
- lib/authem/sorcery_user.rb
|
116
169
|
- lib/authem/token.rb
|
170
|
+
- lib/authem/user.rb
|
117
171
|
- lib/authem/version.rb
|
118
172
|
- lib/authem.rb
|
119
173
|
- LICENSE
|
@@ -121,30 +175,26 @@ files:
|
|
121
175
|
- Rakefile
|
122
176
|
homepage: https://github.com/paulelliott/authem
|
123
177
|
licenses: []
|
124
|
-
|
125
178
|
post_install_message:
|
126
179
|
rdoc_options: []
|
127
|
-
|
128
|
-
require_paths:
|
180
|
+
require_paths:
|
129
181
|
- lib
|
130
|
-
required_ruby_version: !ruby/object:Gem::Requirement
|
182
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
131
183
|
none: false
|
132
|
-
requirements:
|
133
|
-
- -
|
134
|
-
- !ruby/object:Gem::Version
|
135
|
-
version:
|
136
|
-
required_rubygems_version: !ruby/object:Gem::Requirement
|
184
|
+
requirements:
|
185
|
+
- - ! '>='
|
186
|
+
- !ruby/object:Gem::Version
|
187
|
+
version: '0'
|
188
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
137
189
|
none: false
|
138
|
-
requirements:
|
139
|
-
- -
|
140
|
-
- !ruby/object:Gem::Version
|
141
|
-
version:
|
190
|
+
requirements:
|
191
|
+
- - ! '>'
|
192
|
+
- !ruby/object:Gem::Version
|
193
|
+
version: 1.3.1
|
142
194
|
requirements: []
|
143
|
-
|
144
195
|
rubyforge_project:
|
145
|
-
rubygems_version: 1.8.
|
196
|
+
rubygems_version: 1.8.24
|
146
197
|
signing_key:
|
147
198
|
specification_version: 3
|
148
199
|
summary: Authem authenticates them by email
|
149
200
|
test_files: []
|
150
|
-
|
data/lib/authem/model.rb
DELETED
@@ -1,44 +0,0 @@
|
|
1
|
-
require 'bcrypt'
|
2
|
-
|
3
|
-
module Authem::Model
|
4
|
-
extend ::ActiveSupport::Concern
|
5
|
-
|
6
|
-
included do
|
7
|
-
Authem::Config.user_class = self
|
8
|
-
|
9
|
-
attr_accessor :password, :password_confirmation
|
10
|
-
|
11
|
-
attr_protected :crypted_password, :salt, :reset_password_token
|
12
|
-
|
13
|
-
validates_confirmation_of :password
|
14
|
-
validates :email, :presence => true, :uniqueness => true
|
15
|
-
|
16
|
-
def self.find_by_email(email)
|
17
|
-
where("upper(email) = ?", email.upcase).first
|
18
|
-
end
|
19
|
-
|
20
|
-
before_save :encrypt_password
|
21
|
-
|
22
|
-
def self.authenticate(email, password)
|
23
|
-
user = find_by_email(email)
|
24
|
-
user if user && user.crypted_password_matches?(password)
|
25
|
-
end
|
26
|
-
end
|
27
|
-
|
28
|
-
def crypted_password_matches?(password)
|
29
|
-
crypted_password.present? && ::BCrypt::Password.new(crypted_password) == [password, salt].join
|
30
|
-
end
|
31
|
-
|
32
|
-
def encrypt_password
|
33
|
-
if password.present?
|
34
|
-
self.salt = ::BCrypt::Engine.generate_salt
|
35
|
-
self.crypted_password = ::BCrypt::Password.create([password, salt].join)
|
36
|
-
end
|
37
|
-
end
|
38
|
-
|
39
|
-
def reset_password_token
|
40
|
-
update_attribute(:reset_password_token, Authem::Token.generate) if self[:reset_password_token].blank?
|
41
|
-
self[:reset_password_token]
|
42
|
-
end
|
43
|
-
|
44
|
-
end
|