easy_auth 0.0.5 → 0.1.0
Sign up to get free protection for your applications and to get access to all the features.
- 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
|
-
[![Build Status](
|
3
|
+
[![Build Status](https://secure.travis-ci.org/dockyard/easy_auth.png?branch=master)](http://travis-ci.org/dockyard/easy_auth)
|
4
|
+
[![Dependency Status](https://gemnasium.com/dockyard/easy_auth.png?travis)](https://gemnasium.com/dockyard/easy_auth)
|
5
|
+
[![Code Climate](https://codeclimate.com/badge.png)](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 %>
|