Ich habe einen recht interessanten Weg gefunden, dies zu überwinden, indem ich eine Sitzungsvariable benutze, um mich daran zu erinnern, welcher Benutzer ausgeloggt ist. Die Idee ist, dass, obwohl der Browser immer noch Authentifizierungsdaten sendet, wir es einfach ignorieren, weil der Benutzer sich abgemeldet hat. Wenn eine neue Anmeldeanforderung an den Browser gesendet wird, werden alle Authentifizierungsdaten gelöscht, sodass sich der Benutzer jederzeit wieder anmelden kann.
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
Dann wird auf der Ereignisse Controller ich tun:
class EventsController < ApplicationController
before_filter :authenticate!, :only => [ :new, :create, :edit, :update ]
#...
end
Und schließlich sieht meine Session-Controller wie folgt aus:
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
Und vergessen Sie nicht, Ihre Routen!
map.logout 'login', :controller => 'session', :action => 'create'
map.logout 'logout', :controller => 'session', :action => 'destroy'
Sessions sind nicht RESTful. – deamon