Skip to content

Commit dde94b0

Browse files
rosaclaude
andcommitted
Delete server-side session on logout
When it's set. Also, store it in current attributes for convenience. Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
1 parent 1852adb commit dde94b0

File tree

4 files changed

+31
-7
lines changed

4 files changed

+31
-7
lines changed

app/controllers/concerns/authentication.rb

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -67,17 +67,27 @@ def resume_session(session)
6767
authenticated_as session
6868
end
6969

70+
def terminate_current_session
71+
Current.session&.destroy!
72+
reset_session
73+
remove_authentication_cookie
74+
end
75+
7076
def authenticated_as(session)
71-
Current.user = session.user
77+
Current.session = session
7278
set_authenticated_by(:session)
73-
cookies.signed.permanent[:session_token] = { value: session.token, httponly: true, same_site: :lax }
79+
set_authentication_cookie(session)
7480
end
7581

7682
def post_authenticating_url
7783
session.delete(:return_to_after_authenticating) || root_url
7884
end
7985

80-
def reset_authentication
86+
def set_authentication_cookie(session)
87+
cookies.signed.permanent[:session_token] = { value: session.token, httponly: true, same_site: :lax }
88+
end
89+
90+
def remove_authentication_cookie
8191
cookies.delete(:session_token)
8292
end
8393

app/controllers/sessions_controller.rb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ def create
1818

1919
def destroy
2020
remove_push_subscription
21-
reset_authentication
21+
terminate_current_session
2222
redirect_to root_url
2323
end
2424

app/models/current.rb

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,16 @@
11
class Current < ActiveSupport::CurrentAttributes
2-
attribute :user, :request
2+
attribute :session, :user, :request
33

44
delegate :host, :protocol, to: :request, prefix: true, allow_nil: true
55

6+
def session=(value)
7+
super(value)
8+
9+
if value.present?
10+
self.user = session.user
11+
end
12+
end
13+
614
def account
715
Account.first
816
end

test/controllers/sessions_controller_test.rb

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,9 @@ class SessionsControllerTest < ActionDispatch::IntegrationTest
2828
end
2929

3030
test "create with valid credentials" do
31-
post session_url, params: { email_address: "david@37signals.com", password: "secret123456" }
31+
assert_difference -> { Session.count }, +1 do
32+
post session_url, params: { email_address: "david@37signals.com", password: "secret123456" }
33+
end
3234

3335
assert_redirected_to root_url
3436
assert parsed_cookies.signed[:session_token]
@@ -43,11 +45,15 @@ class SessionsControllerTest < ActionDispatch::IntegrationTest
4345

4446
test "destroy" do
4547
sign_in :david
48+
session = users(:david).sessions.last
4649

47-
delete session_url
50+
assert_difference -> { Session.count }, -1 do
51+
delete session_url
52+
end
4853

4954
assert_redirected_to root_url
5055
assert_not cookies[:session_token].present?
56+
assert_nil Session.find_by(id: session.id)
5157
end
5258

5359
test "destroy removes the push subscription for the device" do

0 commit comments

Comments
 (0)