authenticate 0.6.1 → 0.7.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.
- checksums.yaml +4 -4
- data/.travis.yml +6 -0
- data/Appraisals +8 -2
- data/CHANGELOG.md +22 -1
- data/README.md +182 -22
- data/app/controllers/authenticate/passwords_controller.rb +1 -0
- data/app/controllers/authenticate/sessions_controller.rb +11 -1
- data/app/controllers/authenticate/users_controller.rb +2 -1
- data/app/views/layouts/application.html.erb +1 -1
- data/authenticate.gemspec +1 -1
- data/gemfiles/5.0.gemfile +0 -1
- data/gemfiles/5.1.gemfile +7 -0
- data/lib/authenticate.rb +1 -0
- data/lib/authenticate/callbacks/authenticatable.rb +1 -1
- data/lib/authenticate/callbacks/brute_force.rb +1 -1
- data/lib/authenticate/controller.rb +54 -22
- data/lib/authenticate/session.rb +22 -15
- data/lib/authenticate/testing/controller_helpers.rb +28 -0
- data/lib/authenticate/testing/integration_tests_sign_on.rb +72 -0
- data/lib/authenticate/testing/rspec.rb +10 -0
- data/lib/authenticate/testing/test_unit.rb +9 -0
- data/lib/authenticate/testing/view_helpers.rb +29 -0
- data/lib/authenticate/version.rb +1 -1
- data/spec/controllers/deprecated_controller_methods_spec.rb +58 -0
- data/spec/controllers/secured_controller_spec.rb +1 -1
- data/spec/dummy/app/controllers/application_controller.rb +2 -1
- data/spec/dummy/app/views/layouts/application.html.erb +1 -1
- data/spec/dummy/config/initializers/authenticate.rb +1 -0
- data/spec/model/session_spec.rb +12 -19
- data/spec/spec_helper.rb +12 -5
- metadata +9 -16
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: dfcdc32766cdac8613010672395197b51dcbd54b
|
4
|
+
data.tar.gz: 32e9e1af1ef1cae8fd69e2aee5306f74837d51b7
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: b63724b793d9f8c48d98151a1bd9e1722ccb6b1f5201de424e8998c94405835d143550f312d5778e66894e44317acae0b919d4bb2e1bb811651d22d0cc39a10e
|
7
|
+
data.tar.gz: 48ef63f7a896e3a00542908688b3e3dbb15056e6b7f8c3f5ecc4add8fb57abef5d4496919d1c91c36bb45452f5154b3b39b2959e454e4a071b22aa1f71ee5582
|
data/.travis.yml
CHANGED
@@ -7,16 +7,22 @@ rvm:
|
|
7
7
|
- 2.1.8
|
8
8
|
- 2.2.4
|
9
9
|
- 2.3.3
|
10
|
+
- 2.4.1
|
10
11
|
|
11
12
|
gemfile:
|
12
13
|
- gemfiles/4.2.gemfile
|
13
14
|
- gemfiles/5.0.gemfile
|
15
|
+
- gemfiles/5.1.gemfile
|
14
16
|
|
15
17
|
|
16
18
|
matrix:
|
17
19
|
exclude:
|
18
20
|
- rvm: 2.1.8
|
19
21
|
gemfile: gemfiles/5.0.gemfile
|
22
|
+
- rvm: 2.1.8
|
23
|
+
gemfile: gemfiles/5.1.gemfile
|
24
|
+
- rvm: 2.4.1
|
25
|
+
gemfile: gemfiles/4.2.gemfile
|
20
26
|
|
21
27
|
install:
|
22
28
|
- "bin/setup"
|
data/Appraisals
CHANGED
@@ -1,10 +1,16 @@
|
|
1
|
-
|
2
|
-
|
1
|
+
if RUBY_VERSION < "2.4.0"
|
2
|
+
appraise "4.2" do
|
3
|
+
gem "rails", "~> 4.2.0"
|
4
|
+
end
|
3
5
|
end
|
4
6
|
|
5
7
|
if RUBY_VERSION >= "2.2.0"
|
6
8
|
appraise "5.0" do
|
7
9
|
gem "rails", "~> 5.0.0"
|
8
10
|
end
|
11
|
+
|
12
|
+
appraise "5.1" do
|
13
|
+
gem "rails", "~> 5.1"
|
14
|
+
end
|
9
15
|
end
|
10
16
|
|
data/CHANGELOG.md
CHANGED
@@ -1,5 +1,26 @@
|
|
1
1
|
# Authenticate Changelog
|
2
2
|
|
3
|
+
|
4
|
+
## [0.7.0] - May 25, 2017
|
5
|
+
|
6
|
+
### API Changes
|
7
|
+
- controller#require_authentication is deprecated, use controller#require_login
|
8
|
+
- controller#authenticated? is deprecated, use controller#logged_in?
|
9
|
+
- added controller#logged_out?
|
10
|
+
`authenticated?` and `required_authentication` will be removed in a future release.
|
11
|
+
|
12
|
+
### Test support
|
13
|
+
- Added login_as via middleware for feature/integration/system tests.
|
14
|
+
- added rspec helpers for view and controller tests
|
15
|
+
- added test-unit helpers for controller/view tests
|
16
|
+
|
17
|
+
### Internal changes - will not affect normal apps
|
18
|
+
- Session#initialize(request, cookies) is now Session#initialize(request)
|
19
|
+
- Session API changes, #authenticated? renamed #logged_in?
|
20
|
+
|
21
|
+
[0.7.0]: https://github.com/tomichj/authenticate/compare/v0.6.1...v0.7.0
|
22
|
+
|
23
|
+
|
3
24
|
## [0.6.1] - May 16, 2017
|
4
25
|
|
5
26
|
### Fixed
|
@@ -31,7 +52,7 @@
|
|
31
52
|
|
32
53
|
|
33
54
|
|
34
|
-
## [0.5.0] - March 26,
|
55
|
+
## [0.5.0] - March 26, 2017oh
|
35
56
|
|
36
57
|
### Support for rails 5.1.
|
37
58
|
|
data/README.md
CHANGED
@@ -23,7 +23,6 @@ Please use [GitHub Issues] to report bugs. You can contact me directly on twitte
|
|
23
23
|
* configuration driven - almost all configuration is performed in the initializer
|
24
24
|
|
25
25
|
|
26
|
-
|
27
26
|
## Implementation Overview
|
28
27
|
|
29
28
|
Authenticate:
|
@@ -71,6 +70,19 @@ You'll need to run the migrations that Authenticate just generated:
|
|
71
70
|
rake db:migrate
|
72
71
|
```
|
73
72
|
|
73
|
+
Finally, you need to secure any controllers that require authentication by adding
|
74
|
+
`before_action :require_login`. If your entire app requires authentication, add it to
|
75
|
+
`ApplicationController`:
|
76
|
+
|
77
|
+
```ruby
|
78
|
+
# app/controllers/application_controller.rb
|
79
|
+
class ApplicationController < ActionController::Base
|
80
|
+
include Authenticate::Controller
|
81
|
+
before_action :require_login
|
82
|
+
protect_from_forgery with: :exception
|
83
|
+
end
|
84
|
+
```
|
85
|
+
|
74
86
|
|
75
87
|
## Configure
|
76
88
|
|
@@ -103,17 +115,16 @@ end
|
|
103
115
|
Configuration parameters are described in detail here: [Configuration](lib/authenticate/configuration.rb)
|
104
116
|
|
105
117
|
|
106
|
-
|
107
118
|
## Use
|
108
119
|
|
109
120
|
### Access Control
|
110
121
|
|
111
|
-
Use the `
|
122
|
+
Use the `require_login` filter to control access to controller actions. To control access to
|
112
123
|
all controller actions, add the filter to your `ApplicationController`, e.g.:
|
113
124
|
|
114
125
|
```ruby
|
115
126
|
class ApplicationController < ActionController::Base
|
116
|
-
before_action :
|
127
|
+
before_action :require_login
|
117
128
|
end
|
118
129
|
```
|
119
130
|
|
@@ -133,12 +144,12 @@ end
|
|
133
144
|
|
134
145
|
### Helpers
|
135
146
|
|
136
|
-
Use `current_user` and `
|
147
|
+
Use `current_user`, `logged_in?`, and `logged_out?` in controllers, views, and helpers.
|
137
148
|
|
138
149
|
Example:
|
139
150
|
|
140
151
|
```erb
|
141
|
-
<% if
|
152
|
+
<% if logged_in? %>
|
142
153
|
<%= current_user.email %>
|
143
154
|
<%= link_to "Sign out", sign_out_path %>
|
144
155
|
<% else %>
|
@@ -196,6 +207,7 @@ application for modification.
|
|
196
207
|
To turn off Authenticate's built-in routes:
|
197
208
|
|
198
209
|
```ruby
|
210
|
+
# config/initializers/authenticate.rb
|
199
211
|
Authenticate.configure do |config|
|
200
212
|
config.routes = false
|
201
213
|
end
|
@@ -222,12 +234,12 @@ For example, to customize `Authenticate::SessionController`:
|
|
222
234
|
* subclass the controller:
|
223
235
|
|
224
236
|
```ruby
|
237
|
+
# app/controllers/sessions_controller.rb
|
225
238
|
class SessionsController < Authenticate::SessionController
|
226
239
|
# render sign in screen
|
227
240
|
def new
|
228
241
|
# ...
|
229
242
|
end
|
230
|
-
...
|
231
243
|
end
|
232
244
|
```
|
233
245
|
|
@@ -239,10 +251,11 @@ Start by dumping a copy of authenticate routes to your `config/routes.rb`:
|
|
239
251
|
$ rails generate authenticate:routes
|
240
252
|
```
|
241
253
|
|
242
|
-
Now update
|
254
|
+
Now update your routes to point to your new controller:
|
255
|
+
|
243
256
|
```ruby
|
257
|
+
# config/routes.rb
|
244
258
|
resource :sessions, controller: 'sessions', only: [:create, :new, :destroy]
|
245
|
-
...
|
246
259
|
```
|
247
260
|
|
248
261
|
You can also use the Authenticate controller generator to copy the default controllers and mailer into
|
@@ -290,21 +303,24 @@ All flash messages and email lines are stored in i18n translations. You can over
|
|
290
303
|
See [config/locales/authenticate.en.yml](/config/locales/authenticate.en.yml) for the default messages.
|
291
304
|
|
292
305
|
|
293
|
-
|
294
306
|
## Extending Authenticate
|
295
307
|
|
296
|
-
Authenticate can be
|
308
|
+
Authenticate can be extended via two mechanisms:
|
297
309
|
|
298
310
|
* user modules: add behavior to the user model
|
299
|
-
* callbacks: add behavior during various authentication events, such as login and subsequent hits
|
311
|
+
* callbacks: add rules or behavior during various authentication events, such as login and subsequent hits
|
312
|
+
|
313
|
+
Most of authenticate's behavior is implemented with a user module and a corresponding callback. User modules add
|
314
|
+
behavior to the user, and the callback uses the user model data to decide an authentication attempt is valid or
|
315
|
+
invalid.
|
300
316
|
|
301
317
|
|
302
318
|
### User Modules
|
303
319
|
|
304
|
-
Add behavior to your User model for your callbacks to use. You can
|
320
|
+
Add behavior to your User model for your callbacks to use. You can include behavior yourself directly
|
305
321
|
in your User class, but you can also use the Authenticate module loading system.
|
306
322
|
|
307
|
-
To add a custom module to
|
323
|
+
To add a custom module for Authenticate to load into your User model, e.g. `MyUserModule`:
|
308
324
|
|
309
325
|
```ruby
|
310
326
|
Authenticate.configuration do |config|
|
@@ -315,14 +331,23 @@ end
|
|
315
331
|
|
316
332
|
### Callbacks
|
317
333
|
|
318
|
-
Callbacks can be added to Authenticate.
|
319
|
-
|
334
|
+
Callbacks can be added to Authenticate. Callbacks available at these points of the authenticate lifecycle:
|
335
|
+
|
336
|
+
- `Authenticate.lifecycle.after_set_user`
|
337
|
+
Runs with every hit requiring authentication. This includes both the initial authentication process and
|
338
|
+
subsequent to any controller secured by Authenticate. These callbacks run immediately after the User is determined.
|
339
|
+
|
340
|
+
- `Authenticate.lifecycle.after_authentication`
|
341
|
+
These callbacks run only during the initial authentication process.
|
320
342
|
|
321
|
-
|
322
|
-
actions on the user or session. Callbacks are passed a block at runtime of `|user, session, options|`.
|
343
|
+
See [Lifecycle](lib/authenticate/lifecycle.rb) for full details.
|
323
344
|
|
324
|
-
|
325
|
-
|
345
|
+
Callbacks must `throw(:failure, message)` to signal an authentication/authorization failure. Callbacks can also perform
|
346
|
+
other actions on the user or session. Callbacks are invoked with `|user, session, options|`.
|
347
|
+
|
348
|
+
Here's a simple example that counts logins for users. It consists of a module for User implemented as an
|
349
|
+
`ActiveSupport::Concern`, with a callback that is defined in an `included` block. The module and callback
|
350
|
+
is added to the User module via the Authenticate configuration.
|
326
351
|
|
327
352
|
```ruby
|
328
353
|
# app/models/concerns/login_count.rb
|
@@ -348,15 +373,150 @@ Authenticate.configuration do |config|
|
|
348
373
|
end
|
349
374
|
```
|
350
375
|
|
376
|
+
More complex callbacks and modules can be implemented in a separate file(s); in that case,
|
377
|
+
the user module should `require` the callback file to inject it into Authenticate's callback lifecycle.
|
378
|
+
|
351
379
|
|
352
380
|
## Testing
|
353
381
|
|
354
|
-
|
382
|
+
### Feature/Integration/System Tests
|
383
|
+
|
384
|
+
Authenticate includes middleware which allows tests to directly sign a test user in,
|
385
|
+
eliminating the need to visit and submit the sign on form. This can significantly speeds up tests.
|
386
|
+
Used by integration, system, feature, etc tests.
|
387
|
+
|
388
|
+
Configure your test environment to enable the middleware:
|
389
|
+
```ruby
|
390
|
+
# config/environments/test.rb
|
391
|
+
MyRailsApp::Application.configure do
|
392
|
+
# ...
|
393
|
+
config.middleware.use Authenticate::Testing::IntegrationTestsSignOn
|
394
|
+
# ...
|
395
|
+
end
|
396
|
+
```
|
397
|
+
|
398
|
+
Sign a test user in by passing as=USER_ID in a query parameter:
|
399
|
+
```ruby
|
400
|
+
visit root_path(as: user)
|
401
|
+
```
|
402
|
+
|
403
|
+
A feature spec using factory_girl and capybara with the integration sign on middleware might look like this:
|
404
|
+
```ruby
|
405
|
+
require 'spec_helper'
|
406
|
+
|
407
|
+
feature 'dashboard' do
|
408
|
+
scenario 'logged in user has name on dashboard' do
|
409
|
+
user = create(:user)
|
410
|
+
visit dashboard_path(as: user)
|
411
|
+
expect(page).to have_content user.name
|
412
|
+
end
|
413
|
+
end
|
414
|
+
```
|
415
|
+
|
416
|
+
|
417
|
+
### Controller Tests
|
418
|
+
|
419
|
+
To test controller actions protected by authenticate with `before_action :require_login`, you can
|
420
|
+
use Authenticate's test helpers.
|
421
|
+
|
422
|
+
For `rspec`, add the following to your `spec/spec_helper.rb` or `spec/rails_helper.rb`:
|
423
|
+
|
424
|
+
```ruby
|
425
|
+
require 'authenticate/testing/rspec'
|
426
|
+
```
|
427
|
+
|
428
|
+
For `test-unit`, add the following to your `test/test_helper.rb`.
|
429
|
+
|
430
|
+
```ruby
|
431
|
+
require 'authenticate/testing/test_unit'
|
432
|
+
```
|
433
|
+
|
434
|
+
This will give you helper methods:
|
435
|
+
|
436
|
+
```ruby
|
437
|
+
login_as(user)
|
438
|
+
logout
|
439
|
+
```
|
440
|
+
|
441
|
+
Once you `login_as(user)`, you will satisfy the `require_login` filter. The other `Authenticate::Controller`
|
442
|
+
methods will then work: `current_user`, `logged_in?`, `logged_out?`
|
443
|
+
|
444
|
+
A controller spec using `factory_girl` and authenticate's controller helpers might look like this:
|
445
|
+
```ruby
|
446
|
+
require 'spec_helper'
|
447
|
+
describe DashboardsController do
|
448
|
+
describe '#show' do
|
449
|
+
it 'shows view' do
|
450
|
+
user = create(:user)
|
451
|
+
login_as(user)
|
452
|
+
get :show
|
453
|
+
expect(response).to be_success
|
454
|
+
expect(response).to render_template 'dashboards/show'
|
455
|
+
end
|
456
|
+
end
|
457
|
+
end
|
458
|
+
```
|
459
|
+
|
460
|
+
Rails 5 built-in test suite's controller tests now extend `ActionDispatch::IntegrationTest`. Use the middleware
|
461
|
+
`IntegrationTestsSignOn` to support sign on. For example:
|
462
|
+
```ruby
|
463
|
+
require 'test_helper'
|
464
|
+
class DashboardsControllerTest < ActionDispatch::IntegrationTest
|
465
|
+
test 'logged in user can GET a dashboard' do
|
466
|
+
user = create(:user)
|
467
|
+
get dashboards_show_path(as: user)
|
468
|
+
assert_response :success
|
469
|
+
end
|
470
|
+
end
|
471
|
+
```
|
472
|
+
|
473
|
+
|
474
|
+
### View Tests
|
475
|
+
|
476
|
+
For `rspec`, require `authenticate/testing/rspec` to include view helpers:
|
477
|
+
|
478
|
+
```ruby
|
479
|
+
login_as(user)
|
480
|
+
current_user
|
481
|
+
logged_in?
|
482
|
+
logged_out?
|
483
|
+
```
|
484
|
+
|
485
|
+
Once you `login_as(user)`, your view can make use of the other helpers as you'd expect.
|
486
|
+
|
487
|
+
An example view spec using `factory_girl` and authenticate's view helpers:
|
488
|
+
```ruby
|
489
|
+
require 'spec_helper'
|
490
|
+
describe 'dashboards/show', type: :view do
|
491
|
+
it 'displays user name' do
|
492
|
+
user = create(:user)
|
493
|
+
login_as(user)
|
494
|
+
render
|
495
|
+
expect(rendered).to match user.name # view uses `current_user`
|
496
|
+
end
|
497
|
+
end
|
498
|
+
```
|
499
|
+
|
500
|
+
|
501
|
+
## Additional Documentation
|
502
|
+
|
503
|
+
Consult the [Authenticate wiki](https://github.com/tomichj/authenticate/wiki/) for additional documentation.
|
504
|
+
|
505
|
+
|
506
|
+
## Versions of Rails Supported
|
507
|
+
|
508
|
+
Authenticate is tested with rails 4.2, 5.0, and 5.1.
|
509
|
+
|
510
|
+
|
511
|
+
## Changelog
|
355
512
|
|
513
|
+
For a summary of changes by version, see the [CHANGELOG.md](/CHANGELOG.md).
|
356
514
|
|
357
515
|
|
358
516
|
## License
|
359
517
|
|
360
|
-
|
518
|
+
Authenticate is copyright © 2015 Justin Tomich. It is free software, and may be
|
519
|
+
redistributed under the terms specified in the [`LICENSE`] file.
|
361
520
|
|
521
|
+
[`LICENSE`]: /LICENSE
|
362
522
|
|
@@ -1,6 +1,7 @@
|
|
1
1
|
# Request password change via an emailed link with a unique token.
|
2
2
|
# Thanks to devise and Clearance.
|
3
3
|
class Authenticate::PasswordsController < Authenticate::AuthenticateController
|
4
|
+
skip_before_action :require_login, only: [:create, :edit, :new, :update], raise: false
|
4
5
|
skip_before_action :require_authentication, only: [:create, :edit, :new, :update], raise: false
|
5
6
|
before_action :ensure_existing_user, only: [:edit, :update]
|
6
7
|
|
@@ -3,12 +3,19 @@
|
|
3
3
|
#
|
4
4
|
class Authenticate::SessionsController < Authenticate::AuthenticateController
|
5
5
|
before_action :redirect_signed_in_users, only: [:new]
|
6
|
+
skip_before_action :require_login, only: [:create, :new, :destroy], raise: false
|
6
7
|
skip_before_action :require_authentication, only: [:create, :new, :destroy], raise: false
|
7
8
|
|
9
|
+
#
|
10
|
+
# Render the login screen.
|
11
|
+
#
|
8
12
|
def new
|
9
13
|
render template: 'sessions/new'
|
10
14
|
end
|
11
15
|
|
16
|
+
#
|
17
|
+
# Log the user in, with the provided name and password.
|
18
|
+
#
|
12
19
|
def create
|
13
20
|
@user = authenticate(params)
|
14
21
|
login(@user) do |status|
|
@@ -21,6 +28,9 @@ class Authenticate::SessionsController < Authenticate::AuthenticateController
|
|
21
28
|
end
|
22
29
|
end
|
23
30
|
|
31
|
+
#
|
32
|
+
# Log the user out
|
33
|
+
#
|
24
34
|
def destroy
|
25
35
|
logout
|
26
36
|
redirect_to url_after_destroy
|
@@ -29,7 +39,7 @@ class Authenticate::SessionsController < Authenticate::AuthenticateController
|
|
29
39
|
private
|
30
40
|
|
31
41
|
def redirect_signed_in_users
|
32
|
-
redirect_to url_for_signed_in_users if
|
42
|
+
redirect_to url_for_signed_in_users if logged_in?
|
33
43
|
end
|
34
44
|
|
35
45
|
def url_after_create
|
@@ -3,6 +3,7 @@
|
|
3
3
|
#
|
4
4
|
class Authenticate::UsersController < Authenticate::AuthenticateController
|
5
5
|
before_action :redirect_signed_in_users, only: [:create, :new]
|
6
|
+
skip_before_action :require_login, only: [:create, :new], raise: false
|
6
7
|
skip_before_action :require_authentication, only: [:create, :new], raise: false
|
7
8
|
|
8
9
|
def new
|
@@ -24,7 +25,7 @@ class Authenticate::UsersController < Authenticate::AuthenticateController
|
|
24
25
|
private
|
25
26
|
|
26
27
|
def redirect_signed_in_users
|
27
|
-
redirect_to Authenticate.configuration.redirect_url if
|
28
|
+
redirect_to Authenticate.configuration.redirect_url if logged_in?
|
28
29
|
end
|
29
30
|
|
30
31
|
def url_after_create
|
data/authenticate.gemspec
CHANGED
@@ -29,7 +29,7 @@ Gem::Specification.new do |s|
|
|
29
29
|
s.add_development_dependency 'rspec-rails', '~> 3.6'
|
30
30
|
s.add_development_dependency 'pry', '~> 0.10'
|
31
31
|
s.add_development_dependency 'sqlite3', '~> 1.3'
|
32
|
-
s.add_development_dependency 'shoulda-matchers', '~> 2.8'
|
32
|
+
# s.add_development_dependency 'shoulda-matchers', '~> 2.8'
|
33
33
|
s.add_development_dependency 'capybara', '~> 2.14'
|
34
34
|
s.add_development_dependency 'database_cleaner', '~> 1.5'
|
35
35
|
s.add_development_dependency 'timecop', '~> 0.8'
|
data/gemfiles/5.0.gemfile
CHANGED
data/lib/authenticate.rb
CHANGED
@@ -2,5 +2,5 @@
|
|
2
2
|
#
|
3
3
|
# If user failed to authenticate, toss them out.
|
4
4
|
Authenticate.lifecycle.after_authentication name: 'authenticatable' do |_user, session, _opts|
|
5
|
-
throw(:failure, I18n.t('callbacks.authenticatable.failure')) unless session && session.
|
5
|
+
throw(:failure, I18n.t('callbacks.authenticatable.failure')) unless session && session.logged_in?
|
6
6
|
end
|
@@ -2,7 +2,7 @@
|
|
2
2
|
# Runs as a hook after authentication.
|
3
3
|
Authenticate.lifecycle.prepend_after_authentication name: 'brute force protection' do |user, session, _options|
|
4
4
|
include ActionView::Helpers::DateHelper
|
5
|
-
unless session.
|
5
|
+
unless session.logged_in? || Authenticate.configuration.max_consecutive_bad_logins_allowed.nil?
|
6
6
|
user_credentials = User.credentials(session.request.params)
|
7
7
|
user ||= User.find_by_credentials(user_credentials)
|
8
8
|
if user && user.respond_to?(:register_failed_login!)
|
@@ -6,7 +6,7 @@ module Authenticate
|
|
6
6
|
#
|
7
7
|
# class ApplicationController < ActionController::Base
|
8
8
|
# include Authenticate::Controller
|
9
|
-
# before_action :
|
9
|
+
# before_action :require_login
|
10
10
|
# protect_from_forgery with: :exception
|
11
11
|
# end
|
12
12
|
#
|
@@ -19,15 +19,16 @@ module Authenticate
|
|
19
19
|
# * require_authentication - restrict access to authenticated users, often from ApplicationController
|
20
20
|
#
|
21
21
|
# Helpers, used anywhere:
|
22
|
-
# * current_user - get the
|
23
|
-
# *
|
22
|
+
# * current_user - get the currently logged in user
|
23
|
+
# * logged_in? - is the user logged in?
|
24
|
+
# * logged_out? - is the user not logged in?
|
24
25
|
#
|
25
26
|
module Controller
|
26
27
|
extend ActiveSupport::Concern
|
27
28
|
include Debug
|
28
29
|
|
29
30
|
included do
|
30
|
-
helper_method :current_user, :authenticated?
|
31
|
+
helper_method :current_user, :logged_in?, :logged_out?, :authenticated?
|
31
32
|
attr_writer :authenticate_session
|
32
33
|
end
|
33
34
|
|
@@ -43,7 +44,7 @@ module Authenticate
|
|
43
44
|
def login(user, &block)
|
44
45
|
authenticate_session.login user, &block
|
45
46
|
|
46
|
-
if
|
47
|
+
if logged_in? && Authenticate.configuration.rotate_csrf_on_sign_in?
|
47
48
|
session.delete(:_csrf_token)
|
48
49
|
form_authenticity_token
|
49
50
|
end
|
@@ -59,25 +60,27 @@ module Authenticate
|
|
59
60
|
# redirect_to '/', notice: 'You logged out successfully'
|
60
61
|
# end
|
61
62
|
def logout
|
62
|
-
authenticate_session.
|
63
|
+
authenticate_session.logout
|
63
64
|
end
|
64
65
|
|
65
|
-
# Use this filter as a before_action to
|
66
|
-
#
|
66
|
+
# Use this filter as a before_action to control access to controller actions,
|
67
|
+
# limiting to logged in users.
|
68
|
+
#
|
69
|
+
# Placing in application_controller will control access to all controllers.
|
67
70
|
#
|
68
71
|
# Example:
|
69
72
|
#
|
70
73
|
# class ApplicationController < ActionController::Base
|
71
|
-
# before_action :
|
74
|
+
# before_action :require_login
|
72
75
|
#
|
73
76
|
# def index
|
74
77
|
# # ...
|
75
78
|
# end
|
76
79
|
# end
|
77
80
|
#
|
78
|
-
def
|
79
|
-
debug
|
80
|
-
unauthorized unless
|
81
|
+
def require_login
|
82
|
+
debug "!!!!!!!!!!!!!!!!!! controller#require_login " # logged_in? #{logged_in?}"
|
83
|
+
unauthorized unless logged_in?
|
81
84
|
message = catch(:failure) do
|
82
85
|
current_user = authenticate_session.current_user
|
83
86
|
Authenticate.lifecycle.run_callbacks(:after_set_user, current_user, authenticate_session, event: :set_user)
|
@@ -87,14 +90,25 @@ module Authenticate
|
|
87
90
|
|
88
91
|
# Has the user been logged in? Exposed as a helper, can be called from views.
|
89
92
|
#
|
90
|
-
# <% if
|
91
|
-
# <%= link_to
|
93
|
+
# <% if logged_in? %>
|
94
|
+
# <%= link_to sign_out_path, "Sign out" %>
|
92
95
|
# <% else %>
|
93
|
-
# <%= link_to
|
96
|
+
# <%= link_to sign_in_path, "Sign in" %>
|
94
97
|
# <% end %>
|
95
98
|
#
|
96
|
-
def
|
97
|
-
|
99
|
+
def logged_in?
|
100
|
+
debug "!!!!!!!!!!!!!!!!!! controller#logged_in?"
|
101
|
+
authenticate_session.logged_in?
|
102
|
+
end
|
103
|
+
|
104
|
+
# Has the user not logged in? Exposed as a helper, can be called from views.
|
105
|
+
#
|
106
|
+
# <% if logged_out? %>
|
107
|
+
# <%= link_to sign_in_path, "Sign in" %>
|
108
|
+
# <% end %>
|
109
|
+
#
|
110
|
+
def logged_out?
|
111
|
+
!logged_in?
|
98
112
|
end
|
99
113
|
|
100
114
|
# Get the current user from the current Authenticate session.
|
@@ -115,11 +129,29 @@ module Authenticate
|
|
115
129
|
is_a?(Authenticate::AuthenticateController)
|
116
130
|
end
|
117
131
|
|
132
|
+
# The old API.
|
133
|
+
#
|
134
|
+
# todo: remove in a future version.
|
135
|
+
def require_authentication
|
136
|
+
warn "#{Kernel.caller.first}: [DEPRECATION] " +
|
137
|
+
"'require_authentication' is deprecated and will be removed in a future release. use 'require_login' instead"
|
138
|
+
require_login
|
139
|
+
end
|
140
|
+
|
141
|
+
# The old API.
|
142
|
+
#
|
143
|
+
# todo: remove in a future version.
|
144
|
+
def authenticated?
|
145
|
+
warn "#{Kernel.caller.first}: [DEPRECATION] " +
|
146
|
+
"'authenticated?' is deprecated and will be removed in a future release. Use 'logged_in?' instead."
|
147
|
+
logged_in?
|
148
|
+
end
|
149
|
+
|
118
150
|
protected
|
119
151
|
|
120
152
|
# User is not authorized, bounce 'em to sign in
|
121
153
|
def unauthorized(msg = t('flashes.failure_when_not_signed_in'))
|
122
|
-
authenticate_session.
|
154
|
+
authenticate_session.logout
|
123
155
|
respond_to do |format|
|
124
156
|
format.any(:js, :json, :xml) { head :unauthorized }
|
125
157
|
format.any { redirect_unauthorized(msg) }
|
@@ -127,13 +159,13 @@ module Authenticate
|
|
127
159
|
end
|
128
160
|
|
129
161
|
def redirect_unauthorized(flash_message)
|
130
|
-
store_location
|
162
|
+
store_location!
|
131
163
|
|
132
164
|
if flash_message
|
133
165
|
flash[:notice] = flash_message # TODO: use locales
|
134
166
|
end
|
135
167
|
|
136
|
-
if
|
168
|
+
if logged_in?
|
137
169
|
redirect_to url_after_denied_access_when_signed_in
|
138
170
|
else
|
139
171
|
redirect_to url_after_denied_access_when_signed_out
|
@@ -164,7 +196,7 @@ module Authenticate
|
|
164
196
|
private
|
165
197
|
|
166
198
|
# Write location to return to in user's session (normally a cookie).
|
167
|
-
def store_location
|
199
|
+
def store_location!
|
168
200
|
if request.get?
|
169
201
|
session[:authenticate_return_to] = request.original_fullpath
|
170
202
|
end
|
@@ -179,7 +211,7 @@ module Authenticate
|
|
179
211
|
end
|
180
212
|
|
181
213
|
def authenticate_session
|
182
|
-
@authenticate_session ||= Authenticate::Session.new(request
|
214
|
+
@authenticate_session ||= Authenticate::Session.new(request)
|
183
215
|
end
|
184
216
|
end
|
185
217
|
end
|
data/lib/authenticate/session.rb
CHANGED
@@ -8,18 +8,31 @@ module Authenticate
|
|
8
8
|
|
9
9
|
attr_accessor :request
|
10
10
|
|
11
|
-
|
11
|
+
# Initialize an Authenticate session.
|
12
|
+
#
|
13
|
+
# The presence of a session does NOT mean the user is logged in; call #logged_in? to determine login status.
|
14
|
+
def initialize(request)
|
12
15
|
@request = request # trackable module accesses request
|
13
|
-
@cookies =
|
16
|
+
@cookies = request.cookie_jar
|
14
17
|
@session_token = @cookies[cookie_name]
|
15
18
|
debug 'SESSION initialize: @session_token: ' + @session_token.inspect
|
16
19
|
end
|
17
20
|
|
18
21
|
# Finish user login process, *after* the user has been authenticated.
|
22
|
+
#
|
19
23
|
# Called when user creates an account or signs back into the app.
|
20
|
-
# Runs all callbacks checking for
|
21
|
-
#
|
24
|
+
# Runs all configured callbacks, checking for login failure.
|
25
|
+
#
|
26
|
+
# If login is successful, @current_user is set and a session token is generated
|
27
|
+
# and returned to the client browser.
|
28
|
+
# If login fails, the user is NOT logged in. No session token is set,
|
29
|
+
# and @current_user will not be set.
|
30
|
+
#
|
31
|
+
# After callbacks are finished, a {LoginStatus} is yielded to the provided block,
|
32
|
+
# if one is provided.
|
22
33
|
#
|
34
|
+
# @param [User] user login completed for this user
|
35
|
+
# @yieldparam [Success,Failure] status result of the sign in operation.
|
23
36
|
# @return [User]
|
24
37
|
def login(user)
|
25
38
|
@current_user = user
|
@@ -45,23 +58,23 @@ module Authenticate
|
|
45
58
|
#
|
46
59
|
# @return [User]
|
47
60
|
def current_user
|
48
|
-
debug
|
61
|
+
debug "session.current_user #{@current_user.inspect}"
|
49
62
|
@current_user ||= load_user_from_session_token if @session_token.present?
|
50
63
|
@current_user
|
51
64
|
end
|
52
65
|
|
53
|
-
# Has this
|
66
|
+
# Has this user successfully logged in?
|
54
67
|
#
|
55
68
|
# @return [Boolean]
|
56
|
-
def
|
57
|
-
debug
|
69
|
+
def logged_in?
|
70
|
+
debug "session.logged_in? #{current_user.present?}"
|
58
71
|
current_user.present?
|
59
72
|
end
|
60
73
|
|
61
74
|
# Invalidate the session token, unset the current user and remove the cookie.
|
62
75
|
#
|
63
76
|
# @return [void]
|
64
|
-
def
|
77
|
+
def logout
|
65
78
|
# nuke session_token in db
|
66
79
|
current_user.reset_session_token! if current_user.present?
|
67
80
|
|
@@ -72,12 +85,6 @@ module Authenticate
|
|
72
85
|
@cookies.delete cookie_name
|
73
86
|
end
|
74
87
|
|
75
|
-
protected
|
76
|
-
|
77
|
-
def user_loaded?
|
78
|
-
!@current_user.present?
|
79
|
-
end
|
80
|
-
|
81
88
|
private
|
82
89
|
|
83
90
|
def write_cookie
|
@@ -0,0 +1,28 @@
|
|
1
|
+
module Authenticate
|
2
|
+
module Testing
|
3
|
+
|
4
|
+
# Helpers for controller tests/specs.
|
5
|
+
#
|
6
|
+
# Example:
|
7
|
+
#
|
8
|
+
# describe DashboardsController do
|
9
|
+
# describe '#show' do
|
10
|
+
# it 'shows view' do
|
11
|
+
# user = create(:user)
|
12
|
+
# login_as(user)
|
13
|
+
# get :show
|
14
|
+
# expect(response).to be_success
|
15
|
+
# end
|
16
|
+
# end
|
17
|
+
# end
|
18
|
+
module ControllerHelpers
|
19
|
+
def login_as(user)
|
20
|
+
controller.login(user)
|
21
|
+
end
|
22
|
+
|
23
|
+
def logout
|
24
|
+
controller.logout
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
@@ -0,0 +1,72 @@
|
|
1
|
+
module Authenticate
|
2
|
+
module Testing
|
3
|
+
|
4
|
+
# Middleware which allows tests to bypass your sign on screen.
|
5
|
+
# Typically used by integration and feature tests, etc.
|
6
|
+
# Speeds up these tests by eliminating the need to visit and
|
7
|
+
# submit the signon form repeatedly.
|
8
|
+
#
|
9
|
+
# Sign a test user in by passing as=USER_ID in a query parameter.
|
10
|
+
# If `User#to_param` is overridden you may pass a block to override
|
11
|
+
# the default user lookup behaviour.
|
12
|
+
#
|
13
|
+
# Configure your application's test environment as follows:
|
14
|
+
#
|
15
|
+
# # config/environments/test.rb
|
16
|
+
# MyRailsApp::Application.configure do
|
17
|
+
# # ...
|
18
|
+
# config.middleware.use Authenticate::IntegrationTestsSignOn
|
19
|
+
# # ...
|
20
|
+
# end
|
21
|
+
#
|
22
|
+
# or if `User#to_param` is overridden (to `username` for example):
|
23
|
+
#
|
24
|
+
# # config/environments/test.rb
|
25
|
+
# MyRailsApp::Application.configure do
|
26
|
+
# # ...
|
27
|
+
# config.middleware.use Authenticate::IntegrationTestsSignOn do |username|
|
28
|
+
# User.find_by(username: username)
|
29
|
+
# end
|
30
|
+
# # ...
|
31
|
+
# end
|
32
|
+
#
|
33
|
+
# After configuring your app, usage in an integration tests is simple:
|
34
|
+
#
|
35
|
+
# user = ... # load user
|
36
|
+
# visit dashboard_path(as: user)
|
37
|
+
#
|
38
|
+
class IntegrationTestsSignOn
|
39
|
+
def initialize(app, &block)
|
40
|
+
@app = app
|
41
|
+
@block = block
|
42
|
+
end
|
43
|
+
|
44
|
+
def call(env)
|
45
|
+
do_login(env)
|
46
|
+
@app.call(env)
|
47
|
+
end
|
48
|
+
|
49
|
+
private
|
50
|
+
|
51
|
+
def do_login(env)
|
52
|
+
params = Rack::Utils.parse_query(env['QUERY_STRING'])
|
53
|
+
user_param = params['as']
|
54
|
+
|
55
|
+
user = find_user(user_param) if user_param.present?
|
56
|
+
if user.present?
|
57
|
+
user.generate_session_token && user.save if user.session_token.nil?
|
58
|
+
request = Rack::Request.new(env)
|
59
|
+
request.cookies[Authenticate.configuration.cookie_name] = user.session_token
|
60
|
+
end
|
61
|
+
end
|
62
|
+
|
63
|
+
def find_user(user_param)
|
64
|
+
if @block
|
65
|
+
@block.call(user_param)
|
66
|
+
else
|
67
|
+
Authenticate.configuration.user_model_class.find(user_param)
|
68
|
+
end
|
69
|
+
end
|
70
|
+
end
|
71
|
+
end
|
72
|
+
end
|
@@ -0,0 +1,10 @@
|
|
1
|
+
require 'authenticate/testing/controller_helpers'
|
2
|
+
require 'authenticate/testing/view_helpers'
|
3
|
+
|
4
|
+
RSpec.configure do |config|
|
5
|
+
config.include Authenticate::Testing::ControllerHelpers, type: :controller
|
6
|
+
config.include Authenticate::Testing::ViewHelpers, type: :view
|
7
|
+
config.before(:each, type: :view) do
|
8
|
+
view.extend Authenticate::Testing::ViewHelpers::CurrentUser
|
9
|
+
end
|
10
|
+
end
|
@@ -0,0 +1,9 @@
|
|
1
|
+
require 'authenticate/testing/controller_helpers'
|
2
|
+
|
3
|
+
# Support for test unit.
|
4
|
+
#
|
5
|
+
# As of Rails 5, controller tests subclass `ActionDispatch::IntegrationTest` and should use
|
6
|
+
# IntegrationTestsSignOn to bypass the sign on screen.
|
7
|
+
class ActionController::TestCase
|
8
|
+
include Authenticate::Testing::ControllerHelpers
|
9
|
+
end
|
@@ -0,0 +1,29 @@
|
|
1
|
+
module Authenticate
|
2
|
+
module Testing
|
3
|
+
|
4
|
+
# Helpers for view tests/specs.
|
5
|
+
#
|
6
|
+
# Use login_as to log in a user for your test case, which allows
|
7
|
+
# `current_user`, `logged_in?` and `logged_out?` to work properly in your test.
|
8
|
+
module ViewHelpers
|
9
|
+
|
10
|
+
# Set the current_user on the view being tested.
|
11
|
+
def login_as(user)
|
12
|
+
view.current_user = user
|
13
|
+
end
|
14
|
+
|
15
|
+
module CurrentUser
|
16
|
+
attr_accessor :current_user
|
17
|
+
|
18
|
+
def logged_in?
|
19
|
+
current_user.present?
|
20
|
+
end
|
21
|
+
|
22
|
+
def logged_out?
|
23
|
+
!logged_in?
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
data/lib/authenticate/version.rb
CHANGED
@@ -0,0 +1,58 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
require 'support/controllers/controller_helpers'
|
3
|
+
|
4
|
+
# Matcher that asserts user was denied access.
|
5
|
+
RSpec::Matchers.define :deny_access do
|
6
|
+
match do |controller|
|
7
|
+
redirects_to_sign_in?(controller) && sets_flash?(controller)
|
8
|
+
end
|
9
|
+
|
10
|
+
def redirects_to_sign_in?(controller)
|
11
|
+
expect(controller).to redirect_to(controller.sign_in_url)
|
12
|
+
end
|
13
|
+
|
14
|
+
def sets_flash?(controller)
|
15
|
+
controller.flash[:notice].match(/sign in to continue/)
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
# A dummy 'secured' controller to test
|
20
|
+
class DeprecatedMethodsController < ActionController::Base
|
21
|
+
include Authenticate::Controller
|
22
|
+
before_action :require_authentication, only: :show
|
23
|
+
|
24
|
+
def new
|
25
|
+
head :ok
|
26
|
+
end
|
27
|
+
|
28
|
+
def show
|
29
|
+
head :ok
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
describe DeprecatedMethodsController, type: :controller do
|
34
|
+
before do
|
35
|
+
Rails.application.routes.draw do
|
36
|
+
resource :deprecated_methods, only: [:new, :show]
|
37
|
+
get '/sign_in' => 'authenticate/sessions#new', as: 'sign_in'
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
after do
|
42
|
+
Rails.application.reload_routes!
|
43
|
+
end
|
44
|
+
|
45
|
+
context 'with authenticated user' do
|
46
|
+
before { sign_in }
|
47
|
+
|
48
|
+
it 'warns but allows access to show' do
|
49
|
+
expect { do_get :show }.to output(/deprecated/i).to_stderr
|
50
|
+
expect(subject).to_not deny_access
|
51
|
+
end
|
52
|
+
|
53
|
+
it 'warns on authenticated?' do
|
54
|
+
expect { subject.authenticated? }.to output(/deprecated/i).to_stderr
|
55
|
+
expect(subject.authenticated?).to be_truthy
|
56
|
+
end
|
57
|
+
end
|
58
|
+
end
|
@@ -19,7 +19,7 @@ end
|
|
19
19
|
# A dummy 'secured' controller to test
|
20
20
|
class SecuredAppsController < ActionController::Base
|
21
21
|
include Authenticate::Controller
|
22
|
-
before_action :
|
22
|
+
before_action :require_login, only: :show
|
23
23
|
|
24
24
|
def new
|
25
25
|
head :ok
|
@@ -1,6 +1,7 @@
|
|
1
1
|
class ApplicationController < ActionController::Base
|
2
2
|
include Authenticate::Controller
|
3
|
-
before_action :require_authentication
|
3
|
+
# before_action :require_authentication
|
4
|
+
before_action :require_login
|
4
5
|
|
5
6
|
# Prevent CSRF attacks by raising an exception.
|
6
7
|
# For APIs, you may want to use :null_session instead.
|
data/spec/model/session_spec.rb
CHANGED
@@ -4,21 +4,19 @@ describe Authenticate::Session do
|
|
4
4
|
describe 'session token' do
|
5
5
|
it 'finds a user from session token' do
|
6
6
|
user = create(:user, :with_session_token)
|
7
|
-
request = mock_request
|
8
|
-
|
9
|
-
session = Authenticate::Session.new(request, cookies)
|
7
|
+
request = mock_request cookies: session_cookie_for(user)
|
8
|
+
session = Authenticate::Session.new(request)
|
10
9
|
expect(session.current_user).to eq user
|
11
10
|
end
|
12
11
|
it 'nil user without a session token' do
|
13
12
|
request = mock_request
|
14
13
|
cookies = {}
|
15
|
-
session = Authenticate::Session.new(request
|
14
|
+
session = Authenticate::Session.new(request)
|
16
15
|
expect(session.current_user).to be_nil
|
17
16
|
end
|
18
17
|
it 'returns nil with a bogus session token' do
|
19
|
-
request = mock_request
|
20
|
-
|
21
|
-
session = Authenticate::Session.new(request, cookies)
|
18
|
+
request = mock_request cookies: { Authenticate.configuration.cookie_name.freeze.to_sym => 'some made up value' }
|
19
|
+
session = Authenticate::Session.new(request)
|
22
20
|
expect(session.current_user).to be_nil
|
23
21
|
end
|
24
22
|
end
|
@@ -26,20 +24,20 @@ describe Authenticate::Session do
|
|
26
24
|
describe '#login' do
|
27
25
|
it 'sets current_user' do
|
28
26
|
user = create(:user)
|
29
|
-
session = Authenticate::Session.new(mock_request
|
27
|
+
session = Authenticate::Session.new(mock_request)
|
30
28
|
session.login(user)
|
31
29
|
expect(session.current_user).to eq user
|
32
30
|
end
|
33
31
|
context 'with a block' do
|
34
32
|
it 'passes the success status to the block when login succeeds' do
|
35
33
|
user = create(:user)
|
36
|
-
session = Authenticate::Session.new(mock_request
|
34
|
+
session = Authenticate::Session.new(mock_request)
|
37
35
|
session.login(user) do |status|
|
38
36
|
expect(status.success?).to eq true
|
39
37
|
end
|
40
38
|
end
|
41
39
|
it 'passes the failure status to the block when login fails' do
|
42
|
-
session = Authenticate::Session.new(mock_request
|
40
|
+
session = Authenticate::Session.new(mock_request)
|
43
41
|
session.login nil do |status|
|
44
42
|
expect(status.success?).to eq false
|
45
43
|
end
|
@@ -47,7 +45,7 @@ describe Authenticate::Session do
|
|
47
45
|
end
|
48
46
|
context 'with nil argument' do
|
49
47
|
it 'assigned current_user to nil' do
|
50
|
-
session = Authenticate::Session.new(mock_request
|
48
|
+
session = Authenticate::Session.new(mock_request)
|
51
49
|
session.login nil
|
52
50
|
expect(session.current_user).to be_nil
|
53
51
|
end
|
@@ -55,13 +53,12 @@ describe Authenticate::Session do
|
|
55
53
|
context 'modules' do
|
56
54
|
it 'runs the callbacks' do
|
57
55
|
user = create(:user, :with_session_token, sign_in_count: 0)
|
58
|
-
|
59
|
-
session = Authenticate::Session.new(
|
56
|
+
request = mock_request cookies: { authenticate_session_token: user.session_token }
|
57
|
+
session = Authenticate::Session.new(request)
|
60
58
|
expect { session.login(user) }. to change { user.sign_in_count }.by(1)
|
61
59
|
end
|
62
60
|
it 'fails login if a callback fails' do
|
63
|
-
|
64
|
-
session = Authenticate::Session.new(mock_request, cookies)
|
61
|
+
session = Authenticate::Session.new(mock_request)
|
65
62
|
session.login nil do |status|
|
66
63
|
expect(status.success?).to eq false
|
67
64
|
expect(status.message).to eq I18n.t('callbacks.authenticatable.failure')
|
@@ -70,7 +67,3 @@ describe Authenticate::Session do
|
|
70
67
|
end
|
71
68
|
end
|
72
69
|
end
|
73
|
-
|
74
|
-
def cookies_for(user)
|
75
|
-
{ Authenticate.configuration.cookie_name.freeze.to_sym => user.session_token }
|
76
|
-
end
|
data/spec/spec_helper.rb
CHANGED
@@ -9,7 +9,7 @@ if ActiveRecord::VERSION::STRING >= '5.0'
|
|
9
9
|
end
|
10
10
|
|
11
11
|
require 'rspec/rails'
|
12
|
-
require 'shoulda-matchers'
|
12
|
+
# require 'shoulda-matchers'
|
13
13
|
require 'capybara/rails'
|
14
14
|
require 'capybara/rspec'
|
15
15
|
require 'database_cleaner'
|
@@ -23,7 +23,7 @@ DatabaseCleaner.strategy = :truncation
|
|
23
23
|
# Load factory girl factories.
|
24
24
|
Dir[File.join(File.dirname(__FILE__), 'factories/**/*.rb')].each { |f| require f }
|
25
25
|
|
26
|
-
# Build test database in spec/dummy/db
|
26
|
+
# Build test database in spec/dummy/db. There's probably a better way to do this.
|
27
27
|
if defined?(ActiveRecord::Migration.maintain_test_schema!)
|
28
28
|
ActiveRecord::Migration.maintain_test_schema! # rails 4.1+
|
29
29
|
else
|
@@ -34,8 +34,6 @@ if ActiveRecord::VERSION::STRING >= '4.2' && ActiveRecord::VERSION::STRING < '5.
|
|
34
34
|
ActiveRecord::Base.raise_in_transactional_callbacks = true
|
35
35
|
end
|
36
36
|
|
37
|
-
puts 'MAJOR:' + Rails::VERSION::MAJOR.to_s
|
38
|
-
|
39
37
|
RSpec.configure do |config|
|
40
38
|
config.include FactoryGirl::Syntax::Methods
|
41
39
|
config.infer_spec_type_from_file_location!
|
@@ -57,13 +55,22 @@ RSpec.configure do |config|
|
|
57
55
|
end
|
58
56
|
end
|
59
57
|
|
60
|
-
|
58
|
+
#
|
59
|
+
# todo - enhance test helpers, put in main project
|
60
|
+
#
|
61
|
+
def mock_request(params: {}, cookies: {})
|
61
62
|
req = double('request')
|
62
63
|
allow(req).to receive(:params).and_return(params)
|
63
64
|
allow(req).to receive(:remote_ip).and_return('111.111.111.111')
|
65
|
+
allow(req).to receive(:cookie_jar).and_return(cookies)
|
64
66
|
req
|
65
67
|
end
|
66
68
|
|
69
|
+
def session_cookie_for(user)
|
70
|
+
{ Authenticate.configuration.cookie_name.freeze.to_sym => user.session_token }
|
71
|
+
end
|
72
|
+
|
73
|
+
|
67
74
|
#
|
68
75
|
# Dumb glue method, deal with rails 4 vs rails 5 get/post methods.
|
69
76
|
#
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: authenticate
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.7.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Justin Tomich
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2017-05-
|
11
|
+
date: 2017-05-26 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bcrypt
|
@@ -114,20 +114,6 @@ dependencies:
|
|
114
114
|
- - "~>"
|
115
115
|
- !ruby/object:Gem::Version
|
116
116
|
version: '1.3'
|
117
|
-
- !ruby/object:Gem::Dependency
|
118
|
-
name: shoulda-matchers
|
119
|
-
requirement: !ruby/object:Gem::Requirement
|
120
|
-
requirements:
|
121
|
-
- - "~>"
|
122
|
-
- !ruby/object:Gem::Version
|
123
|
-
version: '2.8'
|
124
|
-
type: :development
|
125
|
-
prerelease: false
|
126
|
-
version_requirements: !ruby/object:Gem::Requirement
|
127
|
-
requirements:
|
128
|
-
- - "~>"
|
129
|
-
- !ruby/object:Gem::Version
|
130
|
-
version: '2.8'
|
131
117
|
- !ruby/object:Gem::Dependency
|
132
118
|
name: capybara
|
133
119
|
requirement: !ruby/object:Gem::Requirement
|
@@ -240,6 +226,7 @@ files:
|
|
240
226
|
- config/routes.rb
|
241
227
|
- gemfiles/4.2.gemfile
|
242
228
|
- gemfiles/5.0.gemfile
|
229
|
+
- gemfiles/5.1.gemfile
|
243
230
|
- lib/authenticate.rb
|
244
231
|
- lib/authenticate/callbacks/authenticatable.rb
|
245
232
|
- lib/authenticate/callbacks/brute_force.rb
|
@@ -263,6 +250,11 @@ files:
|
|
263
250
|
- lib/authenticate/model/username.rb
|
264
251
|
- lib/authenticate/modules.rb
|
265
252
|
- lib/authenticate/session.rb
|
253
|
+
- lib/authenticate/testing/controller_helpers.rb
|
254
|
+
- lib/authenticate/testing/integration_tests_sign_on.rb
|
255
|
+
- lib/authenticate/testing/rspec.rb
|
256
|
+
- lib/authenticate/testing/test_unit.rb
|
257
|
+
- lib/authenticate/testing/view_helpers.rb
|
266
258
|
- lib/authenticate/token.rb
|
267
259
|
- lib/authenticate/user.rb
|
268
260
|
- lib/authenticate/version.rb
|
@@ -284,6 +276,7 @@ files:
|
|
284
276
|
- lib/generators/authenticate/views/USAGE
|
285
277
|
- lib/generators/authenticate/views/views_generator.rb
|
286
278
|
- lib/tasks/authenticate_tasks.rake
|
279
|
+
- spec/controllers/deprecated_controller_methods_spec.rb
|
287
280
|
- spec/controllers/secured_controller_spec.rb
|
288
281
|
- spec/dummy/README.rdoc
|
289
282
|
- spec/dummy/Rakefile
|