quo_vadis 0.0.1 → 1.0.0
Sign up to get free protection for your applications and to get access to all the features.
- data/.gitignore +2 -0
- data/Gemfile.lock +114 -0
- data/README.md +79 -0
- data/Rakefile +11 -0
- data/app/controllers/controller_mixin.rb +20 -0
- data/app/controllers/quo_vadis/sessions_controller.rb +36 -0
- data/app/models/model_mixin.rb +44 -0
- data/config/initializers/quo_vadis.rb +50 -0
- data/config/locales/quo_vadis.en.yml +7 -0
- data/config/routes.rb +7 -0
- data/lib/generators/quo_vadis/install_generator.rb +28 -0
- data/lib/generators/quo_vadis/templates/migration.rb +11 -0
- data/lib/quo_vadis/engine.rb +15 -0
- data/lib/quo_vadis/version.rb +1 -1
- data/lib/quo_vadis.rb +63 -1
- data/quo_vadis.gemspec +8 -1
- data/test/dummy/.gitignore +1 -0
- data/test/dummy/app/controllers/application_controller.rb +3 -0
- data/test/dummy/app/controllers/articles_controller.rb +11 -0
- data/test/dummy/app/helpers/application_helper.rb +2 -0
- data/test/dummy/app/helpers/articles_helper.rb +2 -0
- data/test/dummy/app/models/article.rb +2 -0
- data/test/dummy/app/models/user.rb +3 -0
- data/test/dummy/app/views/articles/index.html.erb +1 -0
- data/test/dummy/app/views/articles/new.html.erb +1 -0
- data/test/dummy/app/views/layouts/application.html.erb +27 -0
- data/test/dummy/app/views/sessions/new.html.erb +15 -0
- data/test/dummy/config/application.rb +21 -0
- data/test/dummy/config/boot.rb +10 -0
- data/test/dummy/config/database.yml +22 -0
- data/test/dummy/config/environment.rb +5 -0
- data/test/dummy/config/environments/development.rb +26 -0
- data/test/dummy/config/environments/production.rb +49 -0
- data/test/dummy/config/environments/test.rb +35 -0
- data/test/dummy/config/initializers/backtrace_silencers.rb +7 -0
- data/test/dummy/config/initializers/inflections.rb +10 -0
- data/test/dummy/config/initializers/mime_types.rb +5 -0
- data/test/dummy/config/initializers/secret_token.rb +7 -0
- data/test/dummy/config/initializers/session_store.rb +8 -0
- data/test/dummy/config/locales/en.yml +5 -0
- data/test/dummy/config/routes.rb +4 -0
- data/test/dummy/config.ru +4 -0
- data/test/dummy/db/migrate/20110124125037_create_users.rb +13 -0
- data/test/dummy/db/migrate/20110124125216_add_authentication_to_users.rb +11 -0
- data/test/dummy/db/migrate/20110124131535_create_articles.rb +14 -0
- data/test/dummy/public/404.html +26 -0
- data/test/dummy/public/422.html +26 -0
- data/test/dummy/public/500.html +26 -0
- data/test/dummy/public/favicon.ico +0 -0
- data/test/dummy/public/javascripts/application.js +2 -0
- data/test/dummy/public/javascripts/controls.js +965 -0
- data/test/dummy/public/javascripts/dragdrop.js +974 -0
- data/test/dummy/public/javascripts/effects.js +1123 -0
- data/test/dummy/public/javascripts/prototype.js +6001 -0
- data/test/dummy/public/javascripts/rails.js +175 -0
- data/test/dummy/public/stylesheets/.gitkeep +0 -0
- data/test/dummy/script/rails +6 -0
- data/test/dummy/tmp/capybara/capybara-20110124133149.html +27 -0
- data/test/dummy/tmp/capybara/capybara-20110124133340.html +27 -0
- data/test/dummy/tmp/capybara/capybara-20110124134001.html +27 -0
- data/test/dummy/tmp/capybara/capybara-20110124134214.html +27 -0
- data/test/dummy/tmp/capybara/capybara-20110124135435.html +39 -0
- data/test/integration/authenticate_test.rb +39 -0
- data/test/integration/config_test.rb +96 -0
- data/test/integration/helper_test.rb +18 -0
- data/test/integration/navigation_test.rb +7 -0
- data/test/integration/sign_in_test.rb +28 -0
- data/test/integration/sign_out_test.rb +20 -0
- data/test/quo_vadis_test.rb +7 -0
- data/test/support/integration_case.rb +5 -0
- data/test/test_helper.rb +46 -0
- metadata +202 -8
data/.gitignore
CHANGED
data/Gemfile.lock
ADDED
@@ -0,0 +1,114 @@
|
|
1
|
+
PATH
|
2
|
+
remote: .
|
3
|
+
specs:
|
4
|
+
quo_vadis (1.0.0)
|
5
|
+
bcrypt-ruby (~> 2.1.4)
|
6
|
+
rails (~> 3.0)
|
7
|
+
|
8
|
+
GEM
|
9
|
+
remote: http://rubygems.org/
|
10
|
+
specs:
|
11
|
+
abstract (1.0.0)
|
12
|
+
actionmailer (3.0.3)
|
13
|
+
actionpack (= 3.0.3)
|
14
|
+
mail (~> 2.2.9)
|
15
|
+
actionpack (3.0.3)
|
16
|
+
activemodel (= 3.0.3)
|
17
|
+
activesupport (= 3.0.3)
|
18
|
+
builder (~> 2.1.2)
|
19
|
+
erubis (~> 2.6.6)
|
20
|
+
i18n (~> 0.4)
|
21
|
+
rack (~> 1.2.1)
|
22
|
+
rack-mount (~> 0.6.13)
|
23
|
+
rack-test (~> 0.5.6)
|
24
|
+
tzinfo (~> 0.3.23)
|
25
|
+
activemodel (3.0.3)
|
26
|
+
activesupport (= 3.0.3)
|
27
|
+
builder (~> 2.1.2)
|
28
|
+
i18n (~> 0.4)
|
29
|
+
activerecord (3.0.3)
|
30
|
+
activemodel (= 3.0.3)
|
31
|
+
activesupport (= 3.0.3)
|
32
|
+
arel (~> 2.0.2)
|
33
|
+
tzinfo (~> 0.3.23)
|
34
|
+
activeresource (3.0.3)
|
35
|
+
activemodel (= 3.0.3)
|
36
|
+
activesupport (= 3.0.3)
|
37
|
+
activesupport (3.0.3)
|
38
|
+
arel (2.0.4)
|
39
|
+
bcrypt-ruby (2.1.4)
|
40
|
+
builder (2.1.2)
|
41
|
+
capybara (0.4.1.1)
|
42
|
+
celerity (>= 0.7.9)
|
43
|
+
culerity (>= 0.2.4)
|
44
|
+
mime-types (>= 1.16)
|
45
|
+
nokogiri (>= 1.3.3)
|
46
|
+
rack (>= 1.0.0)
|
47
|
+
rack-test (>= 0.5.4)
|
48
|
+
selenium-webdriver (>= 0.0.27)
|
49
|
+
xpath (~> 0.1.3)
|
50
|
+
celerity (0.8.7)
|
51
|
+
childprocess (0.1.6)
|
52
|
+
ffi (~> 0.6.3)
|
53
|
+
configuration (1.2.0)
|
54
|
+
culerity (0.2.15)
|
55
|
+
erubis (2.6.6)
|
56
|
+
abstract (>= 1.0.0)
|
57
|
+
ffi (0.6.3)
|
58
|
+
rake (>= 0.8.7)
|
59
|
+
i18n (0.4.1)
|
60
|
+
json_pure (1.5.0)
|
61
|
+
launchy (0.3.7)
|
62
|
+
configuration (>= 0.0.5)
|
63
|
+
rake (>= 0.8.1)
|
64
|
+
mail (2.2.10)
|
65
|
+
activesupport (>= 2.3.6)
|
66
|
+
i18n (~> 0.4.1)
|
67
|
+
mime-types (~> 1.16)
|
68
|
+
treetop (~> 1.4.8)
|
69
|
+
mime-types (1.16)
|
70
|
+
nokogiri (1.4.4)
|
71
|
+
polyglot (0.3.1)
|
72
|
+
rack (1.2.1)
|
73
|
+
rack-mount (0.6.13)
|
74
|
+
rack (>= 1.0.0)
|
75
|
+
rack-test (0.5.6)
|
76
|
+
rack (>= 1.0)
|
77
|
+
rails (3.0.3)
|
78
|
+
actionmailer (= 3.0.3)
|
79
|
+
actionpack (= 3.0.3)
|
80
|
+
activerecord (= 3.0.3)
|
81
|
+
activeresource (= 3.0.3)
|
82
|
+
activesupport (= 3.0.3)
|
83
|
+
bundler (~> 1.0)
|
84
|
+
railties (= 3.0.3)
|
85
|
+
railties (3.0.3)
|
86
|
+
actionpack (= 3.0.3)
|
87
|
+
activesupport (= 3.0.3)
|
88
|
+
rake (>= 0.8.7)
|
89
|
+
thor (~> 0.14.4)
|
90
|
+
rake (0.8.7)
|
91
|
+
rubyzip (0.9.4)
|
92
|
+
selenium-webdriver (0.1.2)
|
93
|
+
childprocess (~> 0.1.5)
|
94
|
+
ffi (~> 0.6.3)
|
95
|
+
json_pure
|
96
|
+
rubyzip
|
97
|
+
sqlite3-ruby (1.2.5)
|
98
|
+
thor (0.14.6)
|
99
|
+
treetop (1.4.8)
|
100
|
+
polyglot (>= 0.3.1)
|
101
|
+
tzinfo (0.3.23)
|
102
|
+
xpath (0.1.3)
|
103
|
+
nokogiri (~> 1.3)
|
104
|
+
|
105
|
+
PLATFORMS
|
106
|
+
ruby
|
107
|
+
|
108
|
+
DEPENDENCIES
|
109
|
+
bcrypt-ruby (~> 2.1.4)
|
110
|
+
capybara (>= 0.4.0)
|
111
|
+
launchy
|
112
|
+
quo_vadis!
|
113
|
+
rails (~> 3.0)
|
114
|
+
sqlite3-ruby
|
data/README.md
ADDED
@@ -0,0 +1,79 @@
|
|
1
|
+
# Quo Vadis?
|
2
|
+
|
3
|
+
Quo Vadis adds simple username/password authentication to Rails 3 applications.
|
4
|
+
|
5
|
+
Features:
|
6
|
+
|
7
|
+
* Minimal effort to add authentication to your app: get up and running in 5 minutes.
|
8
|
+
* No surprises: it does what you expect.
|
9
|
+
* Easy to customise.
|
10
|
+
* Uses BCrypt to encrypt passwords.
|
11
|
+
* Sign in, sign out, authenticate actions.
|
12
|
+
|
13
|
+
Forthcoming features:
|
14
|
+
|
15
|
+
* Handle forgotten-details.
|
16
|
+
* Let you choose which model(s) to authenticate (currently `User`).
|
17
|
+
* Let you choose the identification field (currently `username`).
|
18
|
+
* Remember authenticated user across browser sessions.
|
19
|
+
* HTTP basic/digest authentication (probably).
|
20
|
+
* Generate (User) model plus migration if it doesn't exist.
|
21
|
+
* Detect presence of `has_secure_password` (see below) and adapt appropriately.
|
22
|
+
|
23
|
+
What it doesn't and won't do:
|
24
|
+
|
25
|
+
* Authorisation.
|
26
|
+
* Sign up; that's user management, not authentication.
|
27
|
+
* Work outside Rails 3.
|
28
|
+
* OpenID, OAuth, LDAP, CAS, etc.
|
29
|
+
* Separate identity from authentication services (cf OmniAuth).
|
30
|
+
* Allow you to have multiple models/scope signed in simultaneously (cf Devise).
|
31
|
+
* Offer so much flexibility that it takes more than 10 minutes to wrap your head around it (cf Devise, Authlogic).
|
32
|
+
|
33
|
+
|
34
|
+
## Quick Start
|
35
|
+
|
36
|
+
Install and run the generator: add `gem 'quo_vadis'` to your Gemfile and run `rails generate quo_vadis:install`.
|
37
|
+
|
38
|
+
Edit and run the generated migration to add authentication columns: `rake db:migrate`. Note the migration (currently) assumes you already have a `User` model.
|
39
|
+
|
40
|
+
In your `User` model, add `authenticates`:
|
41
|
+
|
42
|
+
class User < ActiveRecord::Base
|
43
|
+
authenticates
|
44
|
+
end
|
45
|
+
|
46
|
+
Note Quo Vadis validates the presence of the password, but it's up to you to add any other validations you want.
|
47
|
+
|
48
|
+
Use `:authenticate` in a `before_filter` to protect your controllers' actions. For example:
|
49
|
+
|
50
|
+
class ArticleController < ActionController::Base
|
51
|
+
before_filter :authenticate, :except => [:index, :show]
|
52
|
+
end
|
53
|
+
|
54
|
+
Write the sign-in view. Your sign-in form must:
|
55
|
+
|
56
|
+
* be in `app/views/sessions/new.html.:format`
|
57
|
+
* post the parameters `:username` and `:password` to `sign_in_url`
|
58
|
+
|
59
|
+
In your layout, use `current_user` to retrieve the signed-in user, and `sign_in_path` and `sign_out_path` as appropriate.
|
60
|
+
|
61
|
+
|
62
|
+
## Customisation
|
63
|
+
|
64
|
+
You can customise the flash messages in `config/locales/quo_vadis.en.yml`.
|
65
|
+
|
66
|
+
You can customise the sign-in and sign-out redirects in `config/initializers/quo_vadis.rb`; they both default to the root route. You can also hook into the sign-in and sign-out process if you need to run any other code.
|
67
|
+
|
68
|
+
If you want to add other session management type features, go right ahead: create a `SessionsController` as normal and carry on.
|
69
|
+
|
70
|
+
|
71
|
+
## See also
|
72
|
+
|
73
|
+
* Rails 3 edge's [ActiveModel::SecurePassword](https://github.com/rails/rails/blob/master/activemodel/lib/active_model/secure_password.rb). It's `has_secure_password` class method is similar to Quo Vadis's `authenticates` class method.
|
74
|
+
* [RailsCast 250: Authentication from Scratch](http://railscasts.com/episodes/250-authentication-from-scratch).
|
75
|
+
|
76
|
+
|
77
|
+
## What's up with the name?
|
78
|
+
|
79
|
+
Roman sentries used to challenge intruders with, "Halt! Who goes there?"; quo vadis is Latin for "Who goes there?". At least that's what my Latin teacher told us, but I was 8 years old then so I may not be remembering this entirely accurately.
|
data/Rakefile
CHANGED
@@ -0,0 +1,20 @@
|
|
1
|
+
module ControllerMixin
|
2
|
+
def self.included(base)
|
3
|
+
base.helper_method :current_user
|
4
|
+
end
|
5
|
+
|
6
|
+
private # TODO: does this mark them as private once mixed in?
|
7
|
+
|
8
|
+
def current_user=(user)
|
9
|
+
session[:current_user_id] = user ? user.id : nil
|
10
|
+
end
|
11
|
+
|
12
|
+
def current_user
|
13
|
+
@current_user ||= User.find(session[:current_user_id]) if session[:current_user_id]
|
14
|
+
end
|
15
|
+
|
16
|
+
def authenticate
|
17
|
+
session[:quo_vadis_original_url] = request.fullpath
|
18
|
+
redirect_to sign_in_url, :notice => t('quo_vadis.flash.before_sign_in') unless current_user
|
19
|
+
end
|
20
|
+
end
|
@@ -0,0 +1,36 @@
|
|
1
|
+
class QuoVadis::SessionsController < ApplicationController
|
2
|
+
|
3
|
+
# sign in
|
4
|
+
def new
|
5
|
+
render 'sessions/new'
|
6
|
+
end
|
7
|
+
|
8
|
+
# sign in
|
9
|
+
def create
|
10
|
+
if user = User.authenticate(params[:username], params[:password])
|
11
|
+
self.current_user = user
|
12
|
+
QuoVadis.signed_in_hook user, request
|
13
|
+
redirect_to QuoVadis.signed_in_url(user, original_url), :notice => t('quo_vadis.flash.after_sign_in')
|
14
|
+
else
|
15
|
+
QuoVadis.failed_sign_in_hook request
|
16
|
+
flash.now[:alert] = t('quo_vadis.flash.failed_sign_in')
|
17
|
+
render 'sessions/new'
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
# sign out
|
22
|
+
def destroy
|
23
|
+
QuoVadis.signed_out_hook current_user, request
|
24
|
+
self.current_user = nil
|
25
|
+
redirect_to QuoVadis.signed_out_url, :notice => t('quo_vadis.flash.sign_out')
|
26
|
+
end
|
27
|
+
|
28
|
+
private
|
29
|
+
|
30
|
+
def original_url
|
31
|
+
url = session[:quo_vadis_original_url]
|
32
|
+
session[:quo_vadis_original_url] = nil
|
33
|
+
url
|
34
|
+
end
|
35
|
+
|
36
|
+
end
|
@@ -0,0 +1,44 @@
|
|
1
|
+
require 'bcrypt'
|
2
|
+
|
3
|
+
module ModelMixin
|
4
|
+
|
5
|
+
def self.included(base)
|
6
|
+
base.send :extend, ClassMethods
|
7
|
+
end
|
8
|
+
|
9
|
+
module ClassMethods
|
10
|
+
def authenticates
|
11
|
+
send :include, InstanceMethodsOnActivation
|
12
|
+
|
13
|
+
attr_reader :password
|
14
|
+
attr_protected :password_digest
|
15
|
+
|
16
|
+
validates :username, :presence => true, :uniqueness => true
|
17
|
+
validates :password, :on => :create, :presence => true
|
18
|
+
validates :password_digest, :presence => true
|
19
|
+
|
20
|
+
instance_eval <<-END
|
21
|
+
def authenticate(username, plain_text_password)
|
22
|
+
user = where(:username => username).first
|
23
|
+
if user && user.has_matching_password?(plain_text_password)
|
24
|
+
user
|
25
|
+
else
|
26
|
+
nil
|
27
|
+
end
|
28
|
+
end
|
29
|
+
END
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
module InstanceMethodsOnActivation
|
34
|
+
def password=(plain_text_password)
|
35
|
+
@password = plain_text_password
|
36
|
+
self.password_digest = BCrypt::Password.create plain_text_password
|
37
|
+
end
|
38
|
+
|
39
|
+
def has_matching_password?(plain_text_password)
|
40
|
+
BCrypt::Password.new(password_digest) == plain_text_password
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
end
|
@@ -0,0 +1,50 @@
|
|
1
|
+
QuoVadis.configure do |config|
|
2
|
+
|
3
|
+
#
|
4
|
+
# Redirection URLs
|
5
|
+
#
|
6
|
+
|
7
|
+
# The URL to redirect the user to after s/he signs in.
|
8
|
+
# Use a proc if the URL depends on the user. E.g.:
|
9
|
+
#
|
10
|
+
# config.signed_in_url = Proc.new do |user|
|
11
|
+
# user.admin? ? :admin : :root
|
12
|
+
# end
|
13
|
+
#
|
14
|
+
# See also `:override_original_url`.
|
15
|
+
config.signed_in_url = :root
|
16
|
+
|
17
|
+
# Whether the `:signed_in_url` should override the URL the user was trying
|
18
|
+
# to reach when they were made to authenticate.
|
19
|
+
config.override_original_url = false
|
20
|
+
|
21
|
+
# The URL to redirect the user to after s/he signs out.
|
22
|
+
config.signed_out_url = :root
|
23
|
+
|
24
|
+
|
25
|
+
#
|
26
|
+
# Hooks
|
27
|
+
#
|
28
|
+
|
29
|
+
# Code to run when the user has signed in. E.g.:
|
30
|
+
#
|
31
|
+
# config.signed_in_hook = Proc.new do |user, request|
|
32
|
+
# user.increment! :sign_in_count # assuming this attribute exists
|
33
|
+
# end
|
34
|
+
config.signed_in_hook = nil
|
35
|
+
|
36
|
+
# Code to run when someone has tried but failed to sign in. E.g.:
|
37
|
+
#
|
38
|
+
# config.failed_sign_in_hook = Proc.new do |request|
|
39
|
+
# logger.info "Failed sign in from #{request.remote_ip}"
|
40
|
+
# end
|
41
|
+
config.failed_sign_in_hook = nil
|
42
|
+
|
43
|
+
# Code to run just before the user has signed out. E.g.:
|
44
|
+
#
|
45
|
+
# config.signed_out_hook = Proc.new do |user, request|
|
46
|
+
# session.reset
|
47
|
+
# end
|
48
|
+
config.signed_out_hook = nil
|
49
|
+
|
50
|
+
end
|
data/config/routes.rb
ADDED
@@ -0,0 +1,28 @@
|
|
1
|
+
require 'rails/generators'
|
2
|
+
require 'rails/generators/migration'
|
3
|
+
require 'rails/generators/active_record/migration'
|
4
|
+
|
5
|
+
module QuoVadis
|
6
|
+
class InstallGenerator < Rails::Generators::Base
|
7
|
+
include Rails::Generators::Migration
|
8
|
+
extend ActiveRecord::Generators::Migration
|
9
|
+
|
10
|
+
source_root File.expand_path('../templates', __FILE__)
|
11
|
+
|
12
|
+
desc 'Copies an initializer, a locale file, and a migration to your application.'
|
13
|
+
|
14
|
+
|
15
|
+
def copy_locale_file
|
16
|
+
copy_file '../../../../config/locales/quo_vadis.en.yml', 'config/locales/quo_vadis.en.yml'
|
17
|
+
end
|
18
|
+
|
19
|
+
def copy_initializer_file
|
20
|
+
copy_file '../../../../config/initializers/quo_vadis.rb', 'config/initializers/quo_vadis.rb'
|
21
|
+
end
|
22
|
+
|
23
|
+
def create_migration_file
|
24
|
+
migration_template 'migration.rb', 'db/migrate/add_authentication_to_users.rb'
|
25
|
+
end
|
26
|
+
|
27
|
+
end
|
28
|
+
end
|
@@ -0,0 +1,11 @@
|
|
1
|
+
class AddAuthenticationToUsers < ActiveRecord::Migration
|
2
|
+
def self.up
|
3
|
+
add_column :users, :username, :string # for user identification
|
4
|
+
add_column :users, :password_digest, :string
|
5
|
+
end
|
6
|
+
|
7
|
+
def self.down
|
8
|
+
remove_column :users, :username
|
9
|
+
remove_column :users, :password_digest
|
10
|
+
end
|
11
|
+
end
|
@@ -0,0 +1,15 @@
|
|
1
|
+
module QuoVadis
|
2
|
+
class Engine < ::Rails::Engine
|
3
|
+
initializer 'quo_vadis.model' do |app|
|
4
|
+
ActiveSupport.on_load(:active_record) do
|
5
|
+
include ModelMixin
|
6
|
+
end
|
7
|
+
end
|
8
|
+
|
9
|
+
initializer 'quo_vadis.controller' do |app|
|
10
|
+
ActiveSupport.on_load(:action_controller) do
|
11
|
+
include ControllerMixin
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
data/lib/quo_vadis/version.rb
CHANGED
data/lib/quo_vadis.rb
CHANGED
@@ -1,3 +1,65 @@
|
|
1
|
+
require 'quo_vadis/engine'
|
2
|
+
|
1
3
|
module QuoVadis
|
2
|
-
|
4
|
+
|
5
|
+
#
|
6
|
+
# Redirection URLs
|
7
|
+
#
|
8
|
+
|
9
|
+
# The URL to redirect the user to after s/he signs in.
|
10
|
+
mattr_accessor :signed_in_url
|
11
|
+
@@signed_in_url = :root
|
12
|
+
|
13
|
+
# Whether the `:signed_in_url` should override the URL the user was trying
|
14
|
+
# to reach when they were made to authenticate.
|
15
|
+
mattr_accessor :override_original_url
|
16
|
+
@@override_original_url = false
|
17
|
+
|
18
|
+
def self.signed_in_url(user, original_url)
|
19
|
+
if original_url && !@@override_original_url
|
20
|
+
original_url
|
21
|
+
else
|
22
|
+
@@signed_in_url.respond_to?(:call) ? @@signed_in_url.call(user) : @@signed_in_url
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
# The URL to redirect the user to after s/he signs out.
|
27
|
+
mattr_accessor :signed_out_url
|
28
|
+
@@signed_in_url = :root
|
29
|
+
|
30
|
+
|
31
|
+
#
|
32
|
+
# Hooks
|
33
|
+
#
|
34
|
+
|
35
|
+
# Code to run when the user has signed in.
|
36
|
+
mattr_accessor :signed_in_hook
|
37
|
+
@@signed_in_hook = nil
|
38
|
+
|
39
|
+
def self.signed_in_hook(user, request)
|
40
|
+
@@signed_in_hook.call(user, request) if @@signed_in_hook
|
41
|
+
end
|
42
|
+
|
43
|
+
# Code to run when someone has tried but failed to sign in.
|
44
|
+
mattr_accessor :failed_sign_in_hook
|
45
|
+
@@failed_sign_in_hook = nil
|
46
|
+
|
47
|
+
def self.failed_sign_in_hook(request)
|
48
|
+
@@failed_sign_in_hook.call(request) if @@failed_sign_in_hook
|
49
|
+
end
|
50
|
+
|
51
|
+
# Code to run just before the user has signed out.
|
52
|
+
mattr_accessor :signed_out_hook
|
53
|
+
@@signed_out_hook = nil
|
54
|
+
|
55
|
+
def self.signed_out_hook(user, request)
|
56
|
+
@@signed_out_hook.call(user, request) if @@signed_out_hook
|
57
|
+
end
|
58
|
+
|
59
|
+
|
60
|
+
# Configure from the initializer.
|
61
|
+
def self.configure
|
62
|
+
yield self
|
63
|
+
end
|
64
|
+
|
3
65
|
end
|
data/quo_vadis.gemspec
CHANGED
@@ -9,7 +9,7 @@ Gem::Specification.new do |s|
|
|
9
9
|
s.authors = ['Andy Stewart']
|
10
10
|
s.email = ['boss@airbladesoftware.com']
|
11
11
|
s.homepage = ''
|
12
|
-
s.summary =
|
12
|
+
s.summary = 'Simple authentication for Rails 3.'
|
13
13
|
s.description = s.summary
|
14
14
|
|
15
15
|
s.rubyforge_project = 'quo_vadis'
|
@@ -18,4 +18,11 @@ Gem::Specification.new do |s|
|
|
18
18
|
s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
|
19
19
|
s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
|
20
20
|
s.require_paths = ['lib']
|
21
|
+
|
22
|
+
s.add_dependency 'rails', '~>3.0'
|
23
|
+
s.add_dependency 'bcrypt-ruby', '~>2.1.4'
|
24
|
+
|
25
|
+
s.add_development_dependency 'sqlite3-ruby'
|
26
|
+
s.add_development_dependency 'capybara', '>= 0.4.0'
|
27
|
+
s.add_development_dependency 'launchy'
|
21
28
|
end
|
@@ -0,0 +1 @@
|
|
1
|
+
db/*.sqlite3
|
@@ -0,0 +1 @@
|
|
1
|
+
<h1>Articles</h1>
|
@@ -0,0 +1 @@
|
|
1
|
+
<h1>New Article</h1>
|
@@ -0,0 +1,27 @@
|
|
1
|
+
<!DOCTYPE html>
|
2
|
+
<html>
|
3
|
+
<head>
|
4
|
+
<title>Dummy</title>
|
5
|
+
<%= stylesheet_link_tag :all %>
|
6
|
+
<%= javascript_include_tag :defaults %>
|
7
|
+
<%= csrf_meta_tag %>
|
8
|
+
</head>
|
9
|
+
<body>
|
10
|
+
|
11
|
+
<div id='topnav'>
|
12
|
+
<% if current_user %>
|
13
|
+
You are signed in as <%= current_user.name %>.
|
14
|
+
<%= link_to 'Sign out', sign_out_path %>
|
15
|
+
<% else %>
|
16
|
+
<%= link_to 'Sign in', sign_in_path %>
|
17
|
+
<% end %>
|
18
|
+
</div>
|
19
|
+
|
20
|
+
<% flash.each do |key, value| %>
|
21
|
+
<div class='flash <%= key %>'><%= value %></div>
|
22
|
+
<% end %>
|
23
|
+
|
24
|
+
<%= yield %>
|
25
|
+
|
26
|
+
</body>
|
27
|
+
</html>
|
@@ -0,0 +1,15 @@
|
|
1
|
+
<h1>Sign in</h1>
|
2
|
+
|
3
|
+
<%= form_tag sign_in_path do %>
|
4
|
+
<p>
|
5
|
+
<%= label_tag :username %>
|
6
|
+
<%= text_field_tag :username %>
|
7
|
+
</p>
|
8
|
+
<p>
|
9
|
+
<%= label_tag :password %>
|
10
|
+
<%= password_field_tag :password %>
|
11
|
+
</p>
|
12
|
+
<p>
|
13
|
+
<%= submit_tag 'Sign in' %>
|
14
|
+
</p>
|
15
|
+
<% end %>
|
@@ -0,0 +1,21 @@
|
|
1
|
+
require File.expand_path('../boot', __FILE__)
|
2
|
+
|
3
|
+
require "active_model/railtie"
|
4
|
+
require "active_record/railtie"
|
5
|
+
require "action_controller/railtie"
|
6
|
+
require "action_view/railtie"
|
7
|
+
require "action_mailer/railtie"
|
8
|
+
|
9
|
+
Bundler.require
|
10
|
+
require 'quo_vadis'
|
11
|
+
|
12
|
+
module Dummy
|
13
|
+
class Application < Rails::Application
|
14
|
+
# Configure the default encoding used in templates for Ruby 1.9.
|
15
|
+
config.encoding = "utf-8"
|
16
|
+
|
17
|
+
# Configure sensitive parameters which will be filtered from the log file.
|
18
|
+
config.filter_parameters += [:password]
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|