Control de sesiones


#1

Hola lista,

Estoy intentando crear para mi aplicación una medida de seguridad
referente a la expiracion de las sesiones. Lo que quiero es que una
sesion finalice si ha estado 15 minutos sin refrescarse o lleva 12 horas
ya creada. Por ahora tengo lo siguiente:

class Session < ActiveRecord::Base
def self.sweep(time_ago = nil)
time = case time_ago
when /^(\d+)m$/ then Time.now - $1.to_i.minute
when /^(\d+)h$/ then Time.now - $1.to_i.hour
when /^(\d+)d$/ then Time.now - $1.to_i.day
else Time.now - 1.hour
end
self.delete_all “updated_at < ‘#{time.to_s(:db)}’ OR
created_at < ‘#{12.hour.ago.to_s(:db)}’”
end
end

Y en application.rb:

before_filter :authorize, :except => [:login, :activate]

def authorize
Session.sweep(“15m”)

unless User.find_by_id(session[:user_id])
reset_session
session[:original_uri] = request.request_uri

 if(User.count == 0)

flash[:notice] = “Por favor, introduzca el primer usuario en el
sistema”

 else

flash[:notice] = “Por favor, identifiquese”

 end

 redirect_to(:controller => :users, :action => :login)

end

end

La cuestión es que navego por la aplicación, la dejo durante más de 15
minutos, realizo una acción y me permite realizarla, pero la que va
inmediatamente posterior no. ¿Cómo es que no me corta en la primera
acción pasado los 15 minutos? Se supone que Session.sweep(“15m”) ha
borrado la session de la base de datos.


#2

Jose Antonio P. wrote:

La cuestión es que navego por la aplicación, la dejo durante más de 15
minutos, realizo una acción y me permite realizarla, pero la que va
inmediatamente posterior no. ¿Cómo es que no me corta en la primera
acción pasado los 15 minutos? Se supone que Session.sweep(“15m”) ha
borrado la session de la base de datos.

solo se me ocurre una cochinada, cuando pasen los 15min redireccionate a
otra pagina, esa seria la accion que te permite realizar, por lo tanto
cuando intentes realizar una segunda accion tampoco te dejara.


#3

2009/1/14 Jose Antonio P. removed_email_address@domain.invalid:

La cuestión es que navego por la aplicación, la dejo durante más de 15
minutos, realizo una acción y me permite realizarla, pero la que va
inmediatamente posterior no. ¿Cómo es que no me corta en la primera
acción pasado los 15 minutos?

Sospecho que es porque el objeto sesion esta ya creado antes de que se
ejecuten esos filtros, y la app trabaja con el al margen de lo que se
haya borrado en base de datos.

Apuesto de todas maneras a que existen plugins que resuelven esto.


#4

¿Habría alguna forma de forzar a rails a cargar de nuevo los valores de
session? Es decir:

def authorize
Session.sweep(“15m”)
#cargar nuevos valores de session por si ha sido borrada la sesion
unless User.find_by_id(session[:user_id])
reset_session
session[:original_uri] = request.request_uri

 if(User.count == 0)
   flash[:notice] = "Por favor, introduzca el primer usuario en el 

sistema"
else
flash[:notice] = “Por favor, identifiquese”
end

 redirect_to(:controller => :users, :action => :login)

end
end

Xavier N. wrote:

Sospecho que es porque el objeto sesion esta ya creado antes de que se
ejecuten esos filtros, y la app trabaja con el al margen de lo que se
haya borrado en base de datos.


#5

Ya me he decidido por un plugin. Limited Sessions. Pero el seguir con lo
de antes era mas bien por cabezonería y por profundizar un poco mas en
las sesiones. A ver que tal va el plugin este.

Xavier N. wrote:

2009/1/15 Jose Antonio P. removed_email_address@domain.invalid:

¿Habría alguna forma de forzar a rails a cargar de nuevo los valores de
session?

Por que no te miras un plugin?


#6

2009/1/15 Jose Antonio P. removed_email_address@domain.invalid:

¿Habría alguna forma de forzar a rails a cargar de nuevo los valores de
session?

Por que no te miras un plugin?