Commit 3692e15

mo khan <mo@mokhan.ca>
2014-11-15 17:07:04
revoke a session when a user logs out.
1 parent f46d8c8
app/models/session.rb
@@ -14,6 +14,10 @@ class Session < ActiveRecord::Base
     end
   end
 
+  def revoke!
+    update_attribute(:revoked_at, Time.now.utc)
+  end
+
   class << self
     def authenticate!(session_key)
       Session.find(session_key)
db/migrate/20141115170606_add_revoked_at_to_sessions.rb
@@ -0,0 +1,5 @@
+class AddRevokedAtToSessions < ActiveRecord::Migration
+  def change
+    add_column :sessions, :revoked_at, :datetime, default: nil
+  end
+end
db/schema.rb
@@ -11,7 +11,7 @@
 #
 # It's strongly recommended that you check this file into your version control system.
 
-ActiveRecord::Schema.define(version: 20141111043011) do
+ActiveRecord::Schema.define(version: 20141115170606) do
 
   # These are extensions that must be enabled in order to support this database
   enable_extension "plpgsql"
@@ -49,6 +49,7 @@ ActiveRecord::Schema.define(version: 20141111043011) do
     t.string   "ip_address"
     t.datetime "created_at"
     t.datetime "updated_at"
+    t.datetime "revoked_at"
   end
 
   create_table "users", force: true do |t|
spec/controllers/sessions_controller_spec.rb
@@ -43,11 +43,19 @@ describe SessionsController do
   context "#destroy" do
     let(:user_session) { create(:session) }
 
-    it "removes the current session" do
+    before :each do
       cookies.signed[:raphael] = user_session.id
       delete :destroy, { id: 'mine' }
+    end
+
+    it "removes the current session" do
       expect(request.cookies[:raphael]).to be_nil
       expect(response).to redirect_to(new_session_path)
     end
+
+    it 'revokes the current session' do
+      user_session.reload
+      expect(user_session.revoked_at).to_not be_nil
+    end
   end
 end
spec/models/session_spec.rb
@@ -25,4 +25,13 @@ describe Session do
       end
     end
   end
+
+  context "#revoke!" do
+    subject { create(:user_session) }
+
+    it 'marks the time the session was revoked' do
+      subject.revoke!
+      expect(subject.revoked_at).to_not be_nil
+    end
+  end
 end
spec/factories.rb
@@ -12,7 +12,7 @@ FactoryGirl.define do
     password_confirmation "password"
   end
 
-  factory :session do
+  factory :session, aliases: [:user_session] do
     user
   end