Refactor session persistence code

This commit is contained in:
Tom Hughes 2012-02-22 22:28:48 +00:00
parent ca74f1c094
commit af13c42322
6 changed files with 56 additions and 91 deletions

View file

@ -1,4 +1,5 @@
class ApplicationController < ActionController::Base
include SessionPersistence
protect_from_forgery

View file

@ -1,3 +0,0 @@
require "session_persistence/session_persistence"
ActionController::Base.class_eval { include SessionPersistence }
ActionController::Base.after_filter :_persist_session

View file

@ -0,0 +1,55 @@
# Copyright (c) 2010 August Lilleaas
#
# Permission is hereby granted, free of charge, to any person obtaining
# a copy of this software and associated documentation files (the
# "Software"), to deal in the Software without restriction, including
# without limitation the rights to use, copy, modify, merge, publish,
# distribute, sublicense, and/or sell copies of the Software, and to
# permit persons to whom the Software is furnished to do so, subject to
# the following conditions:
#
# The above copyright notice and this permission notice shall be
# included in all copies or substantial portions of the Software.
#
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
module SessionPersistence
private
# Install filter when we are included
def self.included(controller)
controller.after_filter :persist_session
end
# Override this method if you don't want to use session[:_remember_for].
def session_persistence_key
:_remember_for
end
# Persist the session.
#
# session_expires_after 1.hour
# session_expires_after 2.weeks
def session_expires_after(seconds)
session[session_persistence_key] = seconds
end
# Expire the session.
def session_expires_automatically
session.delete(session_persistence_key)
request.session_options[:renew] = true
end
# Filter callback
def persist_session
if session[session_persistence_key]
request.session_options[:expire_after] = session[session_persistence_key]
end
end
end

View file

@ -1,20 +0,0 @@
Copyright (c) 2010 August Lilleaas
Permission is hereby granted, free of charge, to any person obtaining
a copy of this software and associated documentation files (the
"Software"), to deal in the Software without restriction, including
without limitation the rights to use, copy, modify, merge, publish,
distribute, sublicense, and/or sell copies of the Software, and to
permit persons to whom the Software is furnished to do so, subject to
the following conditions:
The above copyright notice and this permission notice shall be
included in all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

View file

@ -1,40 +0,0 @@
= Session Persistence
Rails 3 plugin that lets you set how long you want your session to be persisted/remembered.
session_expires_after 2.weeks
session_expires_automatically # also aliased to expire_session
The timespan will reset on every request. If you set it to 2 weeks, and the user returns after 1 week, the session will be refreshed and last 2 weeks again. If the user returns after 3 weeks, the session will be reset.
A call to session_expires_automatically will return to a normal automatical expiry cookie, that will expire when the browser is closed.
Note: I haven't tested the plugin with memcache session storage, but it should work there as well.
= Usage
Here's an example sessions controller in a Rails 3 application.
class SessionsController < ApplicationController
def create
session_expires_after 2.weeks if params[:remember_me]
# ..normal auth goes here..
# for example
user = User.authenticate(params[:username], params[:password])
if user
session[:user] = user.id
else
# ..
end
end
def destroy
session_expires_automatically
# ..unauthorize here..
# for example
session[:user] = nil
redirect_to root_path
end
end

View file

@ -1,28 +0,0 @@
module SessionPersistence
private
# Override this method if you don't want to use session[:_remember_for].
def session_persistence_key
:_remember_for
end
# Persist the session.
#
# session_expires_after 1.hour
# session_expires_after 2.weeks
def session_expires_after(seconds)
session[session_persistence_key] = seconds
end
# Expire the session.
def session_expires_automatically
session.delete(session_persistence_key)
end
alias_method :expire_session, :session_expires_automatically
def _persist_session
if session[session_persistence_key]
env["rack.session.options"][:expire_after] = session[session_persistence_key]
end
end
end