easy_auth 0.0.5 → 0.1.0
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.md +3 -1
- data/Rakefile +5 -21
- data/app/helpers/easy_auth_helper.rb +41 -0
- data/app/models/easy_auth/identity.rb +3 -0
- data/db/migrate/{20120227014023_create_identities.rb → 20120227014023_create_easy_auth_identities.rb} +3 -2
- data/lib/easy_auth/controllers/authenticated.rb +19 -0
- data/lib/easy_auth/controllers/sessions.rb +86 -0
- data/lib/easy_auth/controllers.rb +5 -0
- data/lib/easy_auth/engine.rb +0 -5
- data/lib/easy_auth/mailers.rb +3 -0
- data/lib/easy_auth/models/account.rb +38 -0
- data/lib/easy_auth/models/identities.rb +3 -0
- data/lib/easy_auth/models/identity.rb +43 -0
- data/lib/easy_auth/models.rb +7 -0
- data/lib/easy_auth/reverse_concern.rb +27 -0
- data/lib/easy_auth/routes.rb +5 -18
- data/lib/easy_auth/token_generator.rb +7 -0
- data/lib/easy_auth/version.rb +1 -1
- data/lib/easy_auth.rb +44 -2
- metadata +29 -34
- data/MIT-LICENSE +0 -20
- data/app/controllers/password_reset_controller.rb +0 -3
- data/app/mailers/password_reset_mailer.rb +0 -4
- data/app/mixins/easy_auth/controllers/authenticated.rb +0 -14
- data/app/mixins/easy_auth/controllers/password_reset.rb +0 -56
- data/app/mixins/easy_auth/controllers/sessions.rb +0 -43
- data/app/mixins/easy_auth/helpers.rb +0 -44
- data/app/mixins/easy_auth/mailers/password_reset.rb +0 -11
- data/app/mixins/easy_auth/models/account.rb +0 -56
- data/app/mixins/easy_auth/models/identity.rb +0 -57
- data/app/models/identity.rb +0 -3
- data/app/views/layouts/easy_auth/application.html.erb +0 -14
- data/app/views/password_reset/edit.html.erb +0 -13
- data/app/views/password_reset/new.html.erb +0 -9
- data/app/views/password_reset_mailer/reset.html.erb +0 -1
- data/app/views/password_reset_mailer/reset.text.erb +0 -1
- data/app/views/sessions/new.html.erb +0 -17
data/README.md
CHANGED
@@ -1,6 +1,8 @@
|
|
1
1
|
# EasyAuth #
|
2
2
|
|
3
|
-
[](http://travis-ci.org/dockyard/easy_auth)
|
4
|
+
[](https://gemnasium.com/dockyard/easy_auth)
|
5
|
+
[](https://codeclimate.com/github/dockyard/easy_auth)
|
4
6
|
|
5
7
|
Dead simple drop in authentication for Rails
|
6
8
|
|
data/Rakefile
CHANGED
@@ -1,26 +1,10 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
|
4
|
-
rescue LoadError
|
5
|
-
puts 'You must `gem install bundler` and `bundle install` to run rake tasks'
|
6
|
-
end
|
7
|
-
begin
|
8
|
-
require 'rdoc/task'
|
9
|
-
rescue LoadError
|
10
|
-
require 'rdoc/rdoc'
|
11
|
-
require 'rake/rdoctask'
|
12
|
-
RDoc::Task = Rake::RDocTask
|
13
|
-
end
|
1
|
+
require 'bundler/setup'
|
2
|
+
require 'rspec/core/rake_task'
|
3
|
+
Bundler::GemHelper.install_tasks
|
14
4
|
|
15
|
-
|
16
|
-
|
17
|
-
rdoc.title = 'EasyAuth'
|
18
|
-
rdoc.options << '--line-numbers'
|
19
|
-
rdoc.rdoc_files.include('README.rdoc')
|
20
|
-
rdoc.rdoc_files.include('lib/**/*.rb')
|
5
|
+
RSpec::Core::RakeTask.new('default') do |t|
|
6
|
+
t.pattern = FileList['spec/**/*_spec.rb']
|
21
7
|
end
|
22
8
|
|
23
9
|
APP_RAKEFILE = File.expand_path("../spec/dummy/Rakefile", __FILE__)
|
24
10
|
load 'rails/tasks/engine.rake'
|
25
|
-
|
26
|
-
Bundler::GemHelper.install_tasks
|
@@ -0,0 +1,41 @@
|
|
1
|
+
module EasyAuthHelper
|
2
|
+
def self.included(base)
|
3
|
+
base.class_eval do
|
4
|
+
helper_method :current_account, :current_user, :account_signed_in?, :user_signed_in?, :account_not_signed_in?, :user_not_signed_in?
|
5
|
+
end
|
6
|
+
end
|
7
|
+
|
8
|
+
def current_account
|
9
|
+
if session[:session_token] && session[:account_class]
|
10
|
+
begin
|
11
|
+
@current_account ||= session[:account_class].constantize.find_by_session_token(session[:session_token])
|
12
|
+
rescue
|
13
|
+
@current_account = nil
|
14
|
+
session.delete(:session_token)
|
15
|
+
end
|
16
|
+
elsif cookies[:remember_token]
|
17
|
+
begin
|
18
|
+
@current_account ||= EasyAuth.identity_model.find_by_remember_token(cookies[:remember_token]).account
|
19
|
+
rescue
|
20
|
+
@current_acount = nil
|
21
|
+
cookies.delete(:remember_token)
|
22
|
+
end
|
23
|
+
else
|
24
|
+
session.delete(:session_token)
|
25
|
+
cookies.delete(:remember_token)
|
26
|
+
end
|
27
|
+
|
28
|
+
@current_account
|
29
|
+
end
|
30
|
+
alias :current_user :current_account
|
31
|
+
|
32
|
+
def account_signed_in?
|
33
|
+
current_account
|
34
|
+
end
|
35
|
+
alias :user_signed_in? :account_signed_in?
|
36
|
+
|
37
|
+
def account_not_signed_in?
|
38
|
+
!account_signed_in?
|
39
|
+
end
|
40
|
+
alias :user_not_signed_in? :account_not_signed_in?
|
41
|
+
end
|
@@ -1,12 +1,13 @@
|
|
1
|
-
class
|
1
|
+
class CreateEasyAuthIdentities < ActiveRecord::Migration
|
2
2
|
def change
|
3
3
|
create_table :identities do |t|
|
4
4
|
t.string :username
|
5
|
-
t.string :
|
5
|
+
t.string :token
|
6
6
|
t.string :account_type
|
7
7
|
t.integer :account_id
|
8
8
|
t.string :reset_token
|
9
9
|
t.string :remember_token
|
10
|
+
t.string :type
|
10
11
|
t.timestamps
|
11
12
|
end
|
12
13
|
|
@@ -0,0 +1,19 @@
|
|
1
|
+
module EasyAuth::Controllers::Authenticated
|
2
|
+
extend EasyAuth::ReverseConcern
|
3
|
+
|
4
|
+
reverse_included do
|
5
|
+
before_filter :attempt_to_authenticate
|
6
|
+
end
|
7
|
+
|
8
|
+
private
|
9
|
+
|
10
|
+
def attempt_to_authenticate
|
11
|
+
if account_not_signed_in?
|
12
|
+
session[:requested_path] = request.path
|
13
|
+
respond_to do |format|
|
14
|
+
format.html { redirect_to main_app.sign_in_url }
|
15
|
+
format.json { render :json => {}, :status => 401 }
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
@@ -0,0 +1,86 @@
|
|
1
|
+
module EasyAuth::Controllers::Sessions
|
2
|
+
extend EasyAuth::ReverseConcern
|
3
|
+
|
4
|
+
def new
|
5
|
+
EasyAuth.new_session(self)
|
6
|
+
end
|
7
|
+
|
8
|
+
def create
|
9
|
+
if identity = EasyAuth.authenticate(self)
|
10
|
+
identity.set_account_session(session)
|
11
|
+
set_remember(identity)
|
12
|
+
if identity.remember
|
13
|
+
cookies[:remember_token] = { :value => identity.generate_remember_token!, :expires => identity.remember_time.from_now }
|
14
|
+
end
|
15
|
+
after_successful_sign_in(identity)
|
16
|
+
else
|
17
|
+
@identity = EasyAuth.find_identity_model(self).new(params[params[:identity]])
|
18
|
+
after_failed_sign_in(@identity)
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
def destroy
|
23
|
+
session.delete(:session_token)
|
24
|
+
session.delete(:account_class)
|
25
|
+
cookies.delete(:remember_token)
|
26
|
+
after_sign_out
|
27
|
+
end
|
28
|
+
|
29
|
+
private
|
30
|
+
|
31
|
+
def after_with_or_default(method_name, identity)
|
32
|
+
send("#{method_name}_with_#{params[:identity]}", identity) || send("#{method_name}_default", identity)
|
33
|
+
end
|
34
|
+
|
35
|
+
def after_successful_sign_in(identity)
|
36
|
+
after_with_or_default(__method__, identity)
|
37
|
+
end
|
38
|
+
|
39
|
+
def after_successful_sign_in_url(identity)
|
40
|
+
after_with_or_default(__method__, identity)
|
41
|
+
end
|
42
|
+
|
43
|
+
def after_failed_sign_in(identity)
|
44
|
+
after_with_or_default(__method__, identity)
|
45
|
+
end
|
46
|
+
|
47
|
+
def after_successful_sign_in_default(identity)
|
48
|
+
redirect_to(session.delete(:requested_path) || after_successful_sign_in_url(identity), :notice => I18n.t('easy_auth.sessions.create.notice'))
|
49
|
+
end
|
50
|
+
|
51
|
+
def after_successful_sign_in_url_default(identity)
|
52
|
+
identity.account
|
53
|
+
end
|
54
|
+
|
55
|
+
def after_failed_sign_in_default(identity)
|
56
|
+
flash.now[:error] = I18n.t('easy_auth.sessions.create.error')
|
57
|
+
render :new
|
58
|
+
end
|
59
|
+
|
60
|
+
def after_sign_out
|
61
|
+
redirect_to main_app.root_url, :notice => I18n.t('easy_auth.sessions.delete.notice')
|
62
|
+
end
|
63
|
+
|
64
|
+
def no_authentication
|
65
|
+
if account_signed_in?
|
66
|
+
redirect_to no_authentication_url
|
67
|
+
end
|
68
|
+
end
|
69
|
+
|
70
|
+
def no_authentication_url
|
71
|
+
main_app.root_url
|
72
|
+
end
|
73
|
+
|
74
|
+
def method_missing(method_name, *args)
|
75
|
+
# Swallow exceptions for identity callbacks
|
76
|
+
unless method_name =~ /after_\w+_with_\w+/
|
77
|
+
super
|
78
|
+
end
|
79
|
+
end
|
80
|
+
|
81
|
+
def set_remember(identity)
|
82
|
+
if identity_attributes = params[ActiveModel::Naming.param_key(EasyAuth.find_identity_model(self).new)]
|
83
|
+
identity.remember = identity_attributes[:remember]
|
84
|
+
end
|
85
|
+
end
|
86
|
+
end
|
data/lib/easy_auth/engine.rb
CHANGED
@@ -2,11 +2,6 @@ module EasyAuth
|
|
2
2
|
class Engine < ::Rails::Engine
|
3
3
|
isolate_namespace EasyAuth
|
4
4
|
|
5
|
-
initializer 'filter_parameters' do |app|
|
6
|
-
app.config.filter_parameters += [:password]
|
7
|
-
app.config.filter_parameters.uniq!
|
8
|
-
end
|
9
|
-
|
10
5
|
config.generators do |g|
|
11
6
|
g.test_framework :rspec, :view_specs => false
|
12
7
|
end
|
@@ -0,0 +1,38 @@
|
|
1
|
+
module EasyAuth::Models::Account
|
2
|
+
include EasyAuth::TokenGenerator
|
3
|
+
extend EasyAuth::ReverseConcern
|
4
|
+
class NoIdentityUsernameError < StandardError; end
|
5
|
+
|
6
|
+
reverse_included do
|
7
|
+
# Relationships
|
8
|
+
has_many :identities, :class_name => 'EasyAuth::Identity', :as => :account, :dependent => :destroy
|
9
|
+
|
10
|
+
def identity_username_attribute
|
11
|
+
self.send(self.class.identity_username_attribute)
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
module ClassMethods
|
16
|
+
def identity_username_attribute
|
17
|
+
if respond_to?(:super)
|
18
|
+
super
|
19
|
+
elsif column_names.include?('username')
|
20
|
+
:username
|
21
|
+
elsif column_names.include?('email')
|
22
|
+
:email
|
23
|
+
else
|
24
|
+
raise EasyAuth::Models::Account::NoIdentityUsernameError, 'your model must have either a #username or #email attribute. Or you must override the .identity_username_attribute class method'
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
def generate_session_token!
|
30
|
+
self.update_column(:session_token, _generate_token(:session))
|
31
|
+
self.session_token
|
32
|
+
end
|
33
|
+
|
34
|
+
def set_session(session)
|
35
|
+
session[:session_token] = generate_session_token!
|
36
|
+
session[:account_class] = self.class.to_s
|
37
|
+
end
|
38
|
+
end
|
@@ -0,0 +1,43 @@
|
|
1
|
+
module EasyAuth::Models::Identity
|
2
|
+
include EasyAuth::TokenGenerator
|
3
|
+
include EasyAuth::ReverseConcern
|
4
|
+
|
5
|
+
def self.included(base)
|
6
|
+
base.class_eval do
|
7
|
+
self.table_name = :identities
|
8
|
+
belongs_to :account, :polymorphic => true
|
9
|
+
extend ClassMethods
|
10
|
+
end
|
11
|
+
end
|
12
|
+
|
13
|
+
module ClassMethods
|
14
|
+
def authenticate(controller = nil)
|
15
|
+
raise NotImplementedError
|
16
|
+
end
|
17
|
+
|
18
|
+
def new_session(controller)
|
19
|
+
controller.instance_variable_set(:@identity, self.new)
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
def set_account_session(session)
|
24
|
+
account.set_session(session)
|
25
|
+
end
|
26
|
+
|
27
|
+
def remember
|
28
|
+
@remember
|
29
|
+
end
|
30
|
+
|
31
|
+
def remember=(value)
|
32
|
+
@remember = ::ActiveRecord::ConnectionAdapters::Column.value_to_boolean(value)
|
33
|
+
end
|
34
|
+
|
35
|
+
def generate_remember_token!
|
36
|
+
update_column(:remember_token, _generate_token(:remember))
|
37
|
+
remember_token
|
38
|
+
end
|
39
|
+
|
40
|
+
def remember_time
|
41
|
+
1.year
|
42
|
+
end
|
43
|
+
end
|
@@ -0,0 +1,27 @@
|
|
1
|
+
module EasyAuth::ReverseConcern
|
2
|
+
def self.extended(base)
|
3
|
+
base.instance_variable_set("@_dependencies", [])
|
4
|
+
end
|
5
|
+
|
6
|
+
def append_features(base)
|
7
|
+
if base.instance_variable_defined?("@_dependencies")
|
8
|
+
base.instance_variable_get("@_dependencies") << self
|
9
|
+
return false
|
10
|
+
else
|
11
|
+
return false if base < self
|
12
|
+
base.class_eval(&@_included_block) if instance_variable_defined?("@_included_block")
|
13
|
+
base.extend const_get("ClassMethods") if const_defined?("ClassMethods")
|
14
|
+
@_dependencies.each { |dep| base.send(:include, dep) }
|
15
|
+
super
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
def reverse_included(base = nil, &block)
|
20
|
+
if base.nil?
|
21
|
+
@_included_block = block
|
22
|
+
else
|
23
|
+
super
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
data/lib/easy_auth/routes.rb
CHANGED
@@ -1,21 +1,8 @@
|
|
1
|
-
module
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
end
|
7
|
-
|
8
|
-
def easy_auth_session_routes
|
9
|
-
get '/sign_out' => 'sessions#destroy', :as => :sign_out
|
10
|
-
get '/sign_in' => 'sessions#new', :as => :sign_in
|
11
|
-
post '/sign_in' => 'sessions#create'
|
12
|
-
end
|
13
|
-
|
14
|
-
def easy_auth_password_reset_routes
|
15
|
-
get '/password_reset' => 'password_reset#new', :as => :password_reset
|
16
|
-
post '/password_reset' => 'password_reset#create'
|
17
|
-
get '/password_reset/:reset_token' => 'password_reset#edit', :as => :edit_password
|
18
|
-
put '/password_reset/:reset_token' => 'password_reset#update'
|
1
|
+
module EasyAuth::Routes
|
2
|
+
def easy_auth_routes
|
3
|
+
get '/sign_out' => 'sessions#destroy', :as => :sign_out
|
4
|
+
methods.grep(/easy_auth_\w+_routes/).each do |routes|
|
5
|
+
send(routes)
|
19
6
|
end
|
20
7
|
end
|
21
8
|
end
|
data/lib/easy_auth/version.rb
CHANGED
data/lib/easy_auth.rb
CHANGED
@@ -1,9 +1,51 @@
|
|
1
|
+
require 'active_support'
|
1
2
|
require 'bcrypt'
|
2
3
|
require 'easy_auth/engine'
|
3
|
-
require 'easy_auth/
|
4
|
+
require 'easy_auth/version'
|
4
5
|
|
5
6
|
module EasyAuth
|
7
|
+
extend ActiveSupport::Autoload
|
8
|
+
|
9
|
+
autoload :Controllers
|
10
|
+
autoload :Mailers
|
11
|
+
autoload :Models
|
12
|
+
autoload :ReverseConcern
|
13
|
+
autoload :Routes
|
14
|
+
autoload :TokenGenerator
|
15
|
+
|
6
16
|
def self.identity_model
|
7
|
-
Identity
|
17
|
+
EasyAuth::Identity
|
18
|
+
end
|
19
|
+
|
20
|
+
def self.account_model
|
21
|
+
User
|
22
|
+
end
|
23
|
+
|
24
|
+
def self.authenticate(controller)
|
25
|
+
if identity_model = find_identity_model(controller)
|
26
|
+
identity_model.authenticate(controller)
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
def self.new_session(controller)
|
31
|
+
identity_model = find_identity_model(controller)
|
32
|
+
identity_model.new_session(controller)
|
33
|
+
end
|
34
|
+
|
35
|
+
def self.config(&block)
|
36
|
+
yield self
|
37
|
+
end
|
38
|
+
|
39
|
+
private
|
40
|
+
|
41
|
+
def self.find_identity_model(controller)
|
42
|
+
method_name = "#{controller.params[:identity]}_identity_model"
|
43
|
+
if respond_to?(method_name)
|
44
|
+
send(method_name, controller)
|
45
|
+
else
|
46
|
+
controller.params[:identity].to_s.camelcase.constantize
|
47
|
+
end
|
8
48
|
end
|
9
49
|
end
|
50
|
+
|
51
|
+
ActionDispatch::Routing::Mapper.send(:include, EasyAuth::Routes)
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: easy_auth
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0
|
4
|
+
version: 0.1.0
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -10,7 +10,7 @@ authors:
|
|
10
10
|
autorequire:
|
11
11
|
bindir: bin
|
12
12
|
cert_chain: []
|
13
|
-
date: 2012-
|
13
|
+
date: 2012-11-02 00:00:00.000000000 Z
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
16
16
|
name: rails
|
@@ -93,7 +93,7 @@ dependencies:
|
|
93
93
|
- !ruby/object:Gem::Version
|
94
94
|
version: '0'
|
95
95
|
- !ruby/object:Gem::Dependency
|
96
|
-
name:
|
96
|
+
name: database_cleaner
|
97
97
|
requirement: !ruby/object:Gem::Requirement
|
98
98
|
none: false
|
99
99
|
requirements:
|
@@ -129,35 +129,35 @@ dependencies:
|
|
129
129
|
requirement: !ruby/object:Gem::Requirement
|
130
130
|
none: false
|
131
131
|
requirements:
|
132
|
-
- -
|
132
|
+
- - ~>
|
133
133
|
- !ruby/object:Gem::Version
|
134
|
-
version:
|
134
|
+
version: 1.7.0
|
135
135
|
type: :development
|
136
136
|
prerelease: false
|
137
137
|
version_requirements: !ruby/object:Gem::Requirement
|
138
138
|
none: false
|
139
139
|
requirements:
|
140
|
-
- -
|
140
|
+
- - ~>
|
141
141
|
- !ruby/object:Gem::Version
|
142
|
-
version:
|
142
|
+
version: 1.7.0
|
143
143
|
- !ruby/object:Gem::Dependency
|
144
|
-
name:
|
144
|
+
name: factory_girl
|
145
145
|
requirement: !ruby/object:Gem::Requirement
|
146
146
|
none: false
|
147
147
|
requirements:
|
148
|
-
- -
|
148
|
+
- - ~>
|
149
149
|
- !ruby/object:Gem::Version
|
150
|
-
version:
|
150
|
+
version: 2.6.0
|
151
151
|
type: :development
|
152
152
|
prerelease: false
|
153
153
|
version_requirements: !ruby/object:Gem::Requirement
|
154
154
|
none: false
|
155
155
|
requirements:
|
156
|
-
- -
|
156
|
+
- - ~>
|
157
157
|
- !ruby/object:Gem::Version
|
158
|
-
version:
|
158
|
+
version: 2.6.0
|
159
159
|
- !ruby/object:Gem::Dependency
|
160
|
-
name:
|
160
|
+
name: bourne
|
161
161
|
requirement: !ruby/object:Gem::Requirement
|
162
162
|
none: false
|
163
163
|
requirements:
|
@@ -173,7 +173,7 @@ dependencies:
|
|
173
173
|
- !ruby/object:Gem::Version
|
174
174
|
version: '0'
|
175
175
|
- !ruby/object:Gem::Dependency
|
176
|
-
name:
|
176
|
+
name: launchy
|
177
177
|
requirement: !ruby/object:Gem::Requirement
|
178
178
|
none: false
|
179
179
|
requirements:
|
@@ -198,32 +198,27 @@ extensions: []
|
|
198
198
|
extra_rdoc_files: []
|
199
199
|
files:
|
200
200
|
- app/controllers/authenticated_controller.rb
|
201
|
-
- app/controllers/password_reset_controller.rb
|
202
201
|
- app/controllers/sessions_controller.rb
|
203
|
-
- app/
|
204
|
-
- app/
|
205
|
-
- app/mixins/easy_auth/controllers/password_reset.rb
|
206
|
-
- app/mixins/easy_auth/controllers/sessions.rb
|
207
|
-
- app/mixins/easy_auth/helpers.rb
|
208
|
-
- app/mixins/easy_auth/mailers/password_reset.rb
|
209
|
-
- app/mixins/easy_auth/models/account.rb
|
210
|
-
- app/mixins/easy_auth/models/identity.rb
|
211
|
-
- app/models/identity.rb
|
212
|
-
- app/views/layouts/easy_auth/application.html.erb
|
213
|
-
- app/views/password_reset/edit.html.erb
|
214
|
-
- app/views/password_reset/new.html.erb
|
215
|
-
- app/views/password_reset_mailer/reset.html.erb
|
216
|
-
- app/views/password_reset_mailer/reset.text.erb
|
217
|
-
- app/views/sessions/new.html.erb
|
202
|
+
- app/helpers/easy_auth_helper.rb
|
203
|
+
- app/models/easy_auth/identity.rb
|
218
204
|
- config/locales/en.yml
|
219
205
|
- config/routes.rb
|
220
|
-
- db/migrate/
|
206
|
+
- db/migrate/20120227014023_create_easy_auth_identities.rb
|
207
|
+
- lib/easy_auth/controllers/authenticated.rb
|
208
|
+
- lib/easy_auth/controllers/sessions.rb
|
209
|
+
- lib/easy_auth/controllers.rb
|
221
210
|
- lib/easy_auth/engine.rb
|
211
|
+
- lib/easy_auth/mailers.rb
|
212
|
+
- lib/easy_auth/models/account.rb
|
213
|
+
- lib/easy_auth/models/identities.rb
|
214
|
+
- lib/easy_auth/models/identity.rb
|
215
|
+
- lib/easy_auth/models.rb
|
216
|
+
- lib/easy_auth/reverse_concern.rb
|
222
217
|
- lib/easy_auth/routes.rb
|
218
|
+
- lib/easy_auth/token_generator.rb
|
223
219
|
- lib/easy_auth/version.rb
|
224
220
|
- lib/easy_auth.rb
|
225
221
|
- lib/tasks/easy_auth_tasks.rake
|
226
|
-
- MIT-LICENSE
|
227
222
|
- Rakefile
|
228
223
|
- README.md
|
229
224
|
homepage: https://github.com/dockyard/easy_auth
|
@@ -240,7 +235,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
240
235
|
version: '0'
|
241
236
|
segments:
|
242
237
|
- 0
|
243
|
-
hash:
|
238
|
+
hash: -3015113123042150927
|
244
239
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
245
240
|
none: false
|
246
241
|
requirements:
|
@@ -249,7 +244,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
249
244
|
version: '0'
|
250
245
|
segments:
|
251
246
|
- 0
|
252
|
-
hash:
|
247
|
+
hash: -3015113123042150927
|
253
248
|
requirements: []
|
254
249
|
rubyforge_project:
|
255
250
|
rubygems_version: 1.8.23
|
data/MIT-LICENSE
DELETED
@@ -1,20 +0,0 @@
|
|
1
|
-
Copyright 2012 YOURNAME
|
2
|
-
|
3
|
-
Permission is hereby granted, free of charge, to any person obtaining
|
4
|
-
a copy of this software and associated documentation files (the
|
5
|
-
"Software"), to deal in the Software without restriction, including
|
6
|
-
without limitation the rights to use, copy, modify, merge, publish,
|
7
|
-
distribute, sublicense, and/or sell copies of the Software, and to
|
8
|
-
permit persons to whom the Software is furnished to do so, subject to
|
9
|
-
the following conditions:
|
10
|
-
|
11
|
-
The above copyright notice and this permission notice shall be
|
12
|
-
included in all copies or substantial portions of the Software.
|
13
|
-
|
14
|
-
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
15
|
-
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
16
|
-
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
17
|
-
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
18
|
-
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
19
|
-
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
20
|
-
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
@@ -1,14 +0,0 @@
|
|
1
|
-
module EasyAuth::Controllers::Authenticated
|
2
|
-
def self.included(base)
|
3
|
-
base.before_filter :attempt_to_authenticate
|
4
|
-
end
|
5
|
-
|
6
|
-
private
|
7
|
-
|
8
|
-
def attempt_to_authenticate
|
9
|
-
if user_not_signed_in?
|
10
|
-
session[:requested_path] = request.path
|
11
|
-
redirect_to main_app.sign_in_url
|
12
|
-
end
|
13
|
-
end
|
14
|
-
end
|
@@ -1,56 +0,0 @@
|
|
1
|
-
module EasyAuth::Controllers::PasswordReset
|
2
|
-
def self.included(base)
|
3
|
-
base.instance_eval do
|
4
|
-
before_filter :find_identity_from_reset_token, :only => [:edit, :update]
|
5
|
-
end
|
6
|
-
end
|
7
|
-
|
8
|
-
def new
|
9
|
-
@identity = EasyAuth.identity_model.new
|
10
|
-
end
|
11
|
-
|
12
|
-
def create
|
13
|
-
if @identity = EasyAuth.identity_model.where(:username => params[:identity][:username]).first
|
14
|
-
@identity.generate_reset_token!
|
15
|
-
PasswordResetMailer.reset(@identity.id).deliver
|
16
|
-
else
|
17
|
-
@identity = EasyAuth.identity_model.new(params[:identity])
|
18
|
-
end
|
19
|
-
|
20
|
-
flash.now[:notice] = I18n.t('easy_auth.password_reset.create.notice')
|
21
|
-
render :new
|
22
|
-
end
|
23
|
-
|
24
|
-
def update
|
25
|
-
if @identity.update_attributes(scope_to_password_params(:identity))
|
26
|
-
after_successful_password_reset(@identity)
|
27
|
-
else
|
28
|
-
after_failed_sign_in(@identity)
|
29
|
-
end
|
30
|
-
end
|
31
|
-
|
32
|
-
private
|
33
|
-
|
34
|
-
def scope_to_password_params(key)
|
35
|
-
params[key].select { |k, v| ['password', 'password_confirmation'].include?(k) }
|
36
|
-
end
|
37
|
-
|
38
|
-
def find_identity_from_reset_token
|
39
|
-
@identity = EasyAuth.identity_model.where(:reset_token => params[:reset_token].to_s).first
|
40
|
-
end
|
41
|
-
|
42
|
-
def after_successful_password_reset(identity)
|
43
|
-
identity.set_account_session(session)
|
44
|
-
identity.update_attribute(:reset_token, nil)
|
45
|
-
redirect_to after_successful_password_reset_url(identity), :notice => I18n.t('easy_auth.password_reset.update.notice')
|
46
|
-
end
|
47
|
-
|
48
|
-
def after_successful_password_reset_url(identity)
|
49
|
-
identity.account
|
50
|
-
end
|
51
|
-
|
52
|
-
def after_failed_password_reset(identity)
|
53
|
-
flash.now[:error] = I18n.t('easy_auth.password_reset.update.error')
|
54
|
-
render :new
|
55
|
-
end
|
56
|
-
end
|
@@ -1,43 +0,0 @@
|
|
1
|
-
module EasyAuth::Controllers::Sessions
|
2
|
-
def new
|
3
|
-
@identity = EasyAuth.identity_model.new
|
4
|
-
end
|
5
|
-
|
6
|
-
def create
|
7
|
-
if identity = EasyAuth.identity_model.authenticate(params[:identity])
|
8
|
-
identity.set_account_session(session)
|
9
|
-
if identity.remember
|
10
|
-
cookies[:remember_token] = { :value => identity.generate_remember_token!, :expires => identity.remember_time.from_now }
|
11
|
-
end
|
12
|
-
after_successful_sign_in(identity)
|
13
|
-
else
|
14
|
-
@identity = EasyAuth.identity_model.new(params[:identity])
|
15
|
-
after_failed_sign_in(@identity)
|
16
|
-
end
|
17
|
-
end
|
18
|
-
|
19
|
-
def destroy
|
20
|
-
session.delete(:session_token)
|
21
|
-
cookies.delete(:remember_token)
|
22
|
-
after_sign_out
|
23
|
-
end
|
24
|
-
|
25
|
-
private
|
26
|
-
|
27
|
-
def after_successful_sign_in(identity)
|
28
|
-
redirect_to session.delete(:requested_path) || after_successful_sign_in_url(identity), :notice => I18n.t('easy_auth.sessions.create.notice')
|
29
|
-
end
|
30
|
-
|
31
|
-
def after_successful_sign_in_url(identity)
|
32
|
-
identity.account
|
33
|
-
end
|
34
|
-
|
35
|
-
def after_failed_sign_in(identity)
|
36
|
-
flash.now[:error] = I18n.t('easy_auth.sessions.create.error')
|
37
|
-
render :new
|
38
|
-
end
|
39
|
-
|
40
|
-
def after_sign_out
|
41
|
-
redirect_to main_app.root_url, :notice => I18n.t('easy_auth.sessions.delete.notice')
|
42
|
-
end
|
43
|
-
end
|
@@ -1,44 +0,0 @@
|
|
1
|
-
module EasyAuth
|
2
|
-
module Helpers
|
3
|
-
def self.included(base)
|
4
|
-
base.class_eval do
|
5
|
-
helper_method :current_account, :current_user, :account_signed_in?, :user_signed_in?, :account_not_signed_in?, :user_not_signed_in?
|
6
|
-
end
|
7
|
-
end
|
8
|
-
|
9
|
-
def current_account
|
10
|
-
if session[:session_token] && session[:account_class]
|
11
|
-
begin
|
12
|
-
@current_account ||= session[:account_class].constantize.find_by_session_token(session[:session_token])
|
13
|
-
rescue
|
14
|
-
@current_account = nil
|
15
|
-
session.delete(:session_token)
|
16
|
-
end
|
17
|
-
elsif cookies[:remember_token]
|
18
|
-
begin
|
19
|
-
@current_account ||= EasyAuth.identity_model.find_by_remember_token(cookies[:remember_token]).account
|
20
|
-
rescue
|
21
|
-
@current_acount = nil
|
22
|
-
cookies.delete(:remember_token)
|
23
|
-
end
|
24
|
-
else
|
25
|
-
session.delete(:session_token)
|
26
|
-
cookies.delete(:remember_token)
|
27
|
-
end
|
28
|
-
|
29
|
-
@current_account
|
30
|
-
end
|
31
|
-
alias :current_user :current_account
|
32
|
-
|
33
|
-
def account_signed_in?
|
34
|
-
current_account
|
35
|
-
end
|
36
|
-
alias :user_signed_in? :account_signed_in?
|
37
|
-
|
38
|
-
def account_not_signed_in?
|
39
|
-
!account_signed_in?
|
40
|
-
end
|
41
|
-
alias :user_not_signed_in? :account_not_signed_in?
|
42
|
-
|
43
|
-
end
|
44
|
-
end
|
@@ -1,11 +0,0 @@
|
|
1
|
-
module EasyAuth::Mailers::PasswordReset
|
2
|
-
def self.included(base)
|
3
|
-
base.clear_action_methods!
|
4
|
-
end
|
5
|
-
|
6
|
-
def reset(id)
|
7
|
-
@identity = EasyAuth.identity_model.find(id)
|
8
|
-
@url = edit_password_url(@identity.reset_token)
|
9
|
-
mail :to => @identity.account.email, :subject => 'Password reset'
|
10
|
-
end
|
11
|
-
end
|
@@ -1,56 +0,0 @@
|
|
1
|
-
module EasyAuth::Models::Account
|
2
|
-
class NoIdentityUsernameError < StandardError; end
|
3
|
-
def self.included(base)
|
4
|
-
base.class_eval do
|
5
|
-
unless respond_to?(:identity_username_attribute)
|
6
|
-
def self.identity_username_attribute
|
7
|
-
if column_names.include?('username')
|
8
|
-
:username
|
9
|
-
elsif column_names.include?('email')
|
10
|
-
:email
|
11
|
-
else
|
12
|
-
raise EasyAuth::Models::Account::NoIdentityUsernameError, 'your model must have either a #username or #email attribute. Or you must override the .identity_username_attribute class method'
|
13
|
-
end
|
14
|
-
end
|
15
|
-
end
|
16
|
-
|
17
|
-
def identity_username_attribute
|
18
|
-
self.send(self.class.identity_username_attribute)
|
19
|
-
end
|
20
|
-
|
21
|
-
has_one :identity, :as => :account
|
22
|
-
before_create :setup_identity, :unless => :skip_identity_validations
|
23
|
-
before_update :update_identity, :unless => :skip_identity_validations
|
24
|
-
|
25
|
-
attr_accessor :password, :skip_identity_validations
|
26
|
-
validates :password, :presence => { :on => :create, :unless => :skip_identity_validations }, :confirmation => true
|
27
|
-
attr_accessible :password, :password_confirmation, :skip_identity_validations
|
28
|
-
validates identity_username_attribute, :presence => true, :unless => :skip_identity_validations
|
29
|
-
end
|
30
|
-
end
|
31
|
-
|
32
|
-
def generate_session_token!
|
33
|
-
token = BCrypt::Password.create("#{id}-session_token-#{DateTime.current}")
|
34
|
-
self.update_attribute(:session_token, token)
|
35
|
-
self.session_token
|
36
|
-
end
|
37
|
-
|
38
|
-
def set_session(session)
|
39
|
-
session[:session_token] = generate_session_token!
|
40
|
-
session[:account_class] = self.class.to_s
|
41
|
-
end
|
42
|
-
|
43
|
-
private
|
44
|
-
|
45
|
-
def setup_identity
|
46
|
-
build_identity(identity_attributes)
|
47
|
-
end
|
48
|
-
|
49
|
-
def update_identity
|
50
|
-
identity.update_attributes(identity_attributes)
|
51
|
-
end
|
52
|
-
|
53
|
-
def identity_attributes
|
54
|
-
{ :username => self.identity_username_attribute, :password => self.password, :password_confirmation => self.password_confirmation }
|
55
|
-
end
|
56
|
-
end
|
@@ -1,57 +0,0 @@
|
|
1
|
-
module EasyAuth::Models::Identity
|
2
|
-
def self.included(base)
|
3
|
-
base.class_eval do
|
4
|
-
belongs_to :account, :polymorphic => true
|
5
|
-
has_secure_password
|
6
|
-
attr_accessible :username, :password, :password_confirmation, :remember
|
7
|
-
validates :username, :uniqueness => true, :presence => true
|
8
|
-
validates :password, :presence => { :on => :create }
|
9
|
-
extend ClassMethods
|
10
|
-
end
|
11
|
-
end
|
12
|
-
|
13
|
-
module ClassMethods
|
14
|
-
def authenticate(attributes = nil)
|
15
|
-
return nil if attributes.nil?
|
16
|
-
|
17
|
-
if identity = where(arel_table[:username].matches(attributes[:username].try(&:strip))).first.try(:authenticate, attributes[:password])
|
18
|
-
identity.remember = attributes[:remember]
|
19
|
-
identity
|
20
|
-
else
|
21
|
-
nil
|
22
|
-
end
|
23
|
-
end
|
24
|
-
end
|
25
|
-
|
26
|
-
def set_account_session(session)
|
27
|
-
account.set_session(session)
|
28
|
-
end
|
29
|
-
|
30
|
-
def remember
|
31
|
-
@remember
|
32
|
-
end
|
33
|
-
|
34
|
-
def remember=(value)
|
35
|
-
@remember = ::ActiveRecord::ConnectionAdapters::Column.value_to_boolean(value)
|
36
|
-
end
|
37
|
-
|
38
|
-
def generate_reset_token!
|
39
|
-
update_attribute(:reset_token, URI.escape(_generate_token(:reset).gsub(/[\.|\\\/]/,'')))
|
40
|
-
self.reset_token
|
41
|
-
end
|
42
|
-
|
43
|
-
def generate_remember_token!
|
44
|
-
self.update_attribute(:remember_token, _generate_token(:remember))
|
45
|
-
self.remember_token
|
46
|
-
end
|
47
|
-
|
48
|
-
def remember_time
|
49
|
-
1.year
|
50
|
-
end
|
51
|
-
|
52
|
-
private
|
53
|
-
|
54
|
-
def _generate_token(type)
|
55
|
-
token = BCrypt::Password.create("#{id}-#{type}_token-#{DateTime.current}")
|
56
|
-
end
|
57
|
-
end
|
data/app/models/identity.rb
DELETED
@@ -1,14 +0,0 @@
|
|
1
|
-
<!DOCTYPE html>
|
2
|
-
<html>
|
3
|
-
<head>
|
4
|
-
<title>EasyAuth</title>
|
5
|
-
<%= stylesheet_link_tag "easy_auth/application", :media => "all" %>
|
6
|
-
<%= javascript_include_tag "easy_auth/application" %>
|
7
|
-
<%= csrf_meta_tags %>
|
8
|
-
</head>
|
9
|
-
<body>
|
10
|
-
|
11
|
-
<%= yield %>
|
12
|
-
|
13
|
-
</body>
|
14
|
-
</html>
|
@@ -1,13 +0,0 @@
|
|
1
|
-
<%= form_for @identity, :url => main_app.edit_password_path(params[:reset_token]) do |f| %>
|
2
|
-
<p>
|
3
|
-
<%= f.label :password %>
|
4
|
-
<%= f.text_field :password %>
|
5
|
-
</p>
|
6
|
-
<p>
|
7
|
-
<%= f.label :password_confirmation %>
|
8
|
-
<%= f.text_field :password_confirmation %>
|
9
|
-
</p>
|
10
|
-
<p>
|
11
|
-
<%= f.submit 'Submit' %>
|
12
|
-
</p>
|
13
|
-
<% end %>
|
@@ -1 +0,0 @@
|
|
1
|
-
<%= link_to 'Reset password', @url %>
|
@@ -1 +0,0 @@
|
|
1
|
-
Reset password: <%= @url %>
|
@@ -1,17 +0,0 @@
|
|
1
|
-
<%= form_for @identity, :url => main_app.sign_in_path do |f| %>
|
2
|
-
<p>
|
3
|
-
<%= f.label :username %>
|
4
|
-
<%= f.text_field :username %>
|
5
|
-
</p>
|
6
|
-
<p>
|
7
|
-
<%= f.label :password %>
|
8
|
-
<%= f.password_field :password %>
|
9
|
-
</p>
|
10
|
-
<p>
|
11
|
-
<%= f.label :remember, "Remember for #{@identity.remember_time.inspect}" %>
|
12
|
-
<%= f.check_box :remember %>
|
13
|
-
</p>
|
14
|
-
<p>
|
15
|
-
<%= f.submit 'Submit' %>
|
16
|
-
</p>
|
17
|
-
<% end %>
|