Skip to content

Commit 1f5ce59

Browse files
committed
Implement #login! helper
1 parent 47f82a5 commit 1f5ce59

File tree

5 files changed

+52
-0
lines changed

5 files changed

+52
-0
lines changed

README.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,7 @@ explaining and the rest are commented:
5555
```ruby
5656
require_login # This is a before action
5757
login(email, password, remember_me = false)
58+
login!(email, password, remember_me = false) # Raises an `Sorcery::InvalidCredentials` exception on failure
5859
auto_login(user) # Login without credentials
5960
logout
6061
logged_in? # Available in views

lib/sorcery/controller.rb

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,6 @@
11
module Sorcery
2+
class InvalidCredentials < StandardError; end
3+
24
module Controller
35
def self.included(klass)
46
klass.class_eval do
@@ -63,6 +65,16 @@ def login(*credentials)
6365
end
6466
end
6567

68+
def login!(*credentials)
69+
user = login(*credentials)
70+
71+
if user.nil?
72+
raise Sorcery::InvalidCredentials
73+
else
74+
user
75+
end
76+
end
77+
6678
def reset_sorcery_session
6779
reset_session # protect from session fixation attacks
6880
end

spec/controllers/controller_spec.rb

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -85,6 +85,39 @@
8585
end
8686
end
8787

88+
describe '#login!' do
89+
context 'when succeeds' do
90+
before do
91+
expect(User).to receive(:authenticate).with('[email protected]', 'secret') { |&block| block.call(user, nil) }
92+
get :test_login_bang, params: { email: '[email protected]', password: 'secret' }
93+
end
94+
95+
it 'assigns user to @user variable' do
96+
expect(assigns[:user]).to eq user
97+
end
98+
99+
it 'writes user id in session' do
100+
expect(session[:user_id]).to eq user.id.to_s
101+
end
102+
103+
it 'sets csrf token in session' do
104+
expect(session[:_csrf_token]).not_to be_nil
105+
end
106+
end
107+
108+
context 'when fails' do
109+
before do
110+
expect(User).to receive(:authenticate).with('[email protected]', 'opensesame!').and_return(nil)
111+
end
112+
113+
it 'raises Sorcery::InvalidCredentials exception' do
114+
expect do
115+
get :test_login_bang, params: { email: '[email protected]', password: 'opensesame!' }
116+
end.to raise_error(Sorcery::InvalidCredentials)
117+
end
118+
end
119+
end
120+
88121
describe '#logout' do
89122
it 'clears the session' do
90123
cookies[:remember_me_token] = nil

spec/rails_app/app/controllers/sorcery_controller.rb

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,11 @@ def test_login
2828
head :ok
2929
end
3030

31+
def test_login_bang
32+
@user = login!(params[:email], params[:password])
33+
head :ok
34+
end
35+
3136
def test_auto_login
3237
@user = User.first
3338
auto_login(@user)

spec/rails_app/config/routes.rb

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33

44
controller :sorcery do
55
get :test_login
6+
get :test_login_bang
67
get :test_logout
78
get :some_action
89
post :test_return_to

0 commit comments

Comments
 (0)