He encontrado una manera bastante interesante de superar esto mediante el uso de una variable de sesión para recordar qué usuario ha cerrado sesión. La idea es que, aunque el navegador todavía envía datos de autenticación, simplemente lo ignoramos, porque el usuario decidió cerrar la sesión. Cada vez que se envía una nueva solicitud de inicio de sesión al navegador, todos los datos de autenticación se borran, por lo que el usuario puede volver a iniciar sesión en cualquier momento.
class ApplicationController < ActionController::Base
# ...
before_filter :authenticate
protected
def authenticate
authenticate_with_http_basic do |username, password|
@current_user = User.find_by_name_and_crypted_password(username, User.digest(password))
@current_user = nil if @current_user && session[:logged_out] == @current_user.id
[email protected]_user.nil?
end
end
def authenticate!
return if @current_user
session[:authenticate_uri] = request.request_uri
redirect_to('/login')
end
end
Luego, en el controlador de eventos que hago:
class EventsController < ApplicationController
before_filter :authenticate!, :only => [ :new, :create, :edit, :update ]
#...
end
Y por último, mi controlador de la sesión tiene el siguiente aspecto:
class SessionController < ApplicationController
before_filter :authenticate!, :only => [ :create ]
def create
if session[:authenticate_uri]
redirect_to(session[:authenticate_uri])
session[:authenticate_uri] = nil
else
redirect_to(new_event_path)
end
end
def destroy
session[:logged_out] = @current_user.id
redirect_to '/'
end
protected
def authenticate!
authenticate_or_request_with_http_basic("Rankings") do |username, password|
@current_user = User.find_by_name_and_crypted_password(username, User.digest(password))
if @current_user && session[:logged_out] == @current_user.id
@current_user = nil
session[:logged_out] = nil
end
[email protected]_user.nil?
end
end
end
y no se olvide de sus rutas!
map.logout 'login', :controller => 'session', :action => 'create'
map.logout 'logout', :controller => 'session', :action => 'destroy'
Las sesiones no son REST. – deamon