Déconnexion avec l'authentification de base HTTP et le plugin restful_authentication
J'ai le restful_authentication le plugin installé dans une application rails, avec un sessions_controller qui a une méthode destroy comme ceci:
def destroy
self.current_user.forget_me if logged_in?
cookies.delete :auth_token
reset_session
flash[:notice] = "You have been logged out."
redirect_back_or_default('/')
end
Dans le contrôleur de l'application j'ai:
before_filter :login_required
Et Dans le sessions_controller j'ai:
skip_before_filter :login_required
Mon problème est que lorsqu'un utilisateur s'authentifie auprès de l'authentification http de base, il/elle n'est pas connecté. la session est détruite, mais l'utilisateur est en mesure de naviguer vers des pages à accès restreint sans problème. Ce problème ne se produit pas avec une authentification de session à l'aide du plugin. Comment puis-je faire de cette méthode de se débarrasser de la base authenication?
source d'informationauteur Chris Drappier
Vous devez vous connecter pour publier un commentaire.
Rien ne peut être fait côté serveur pour déconnexion d'un utilisateur dans cette situation. Lorsque l'utilisateur se connecte par le biais de l'authentification de base, le navigateur stocke les informations d'authentification, et envoie les paramètres d'authentification par les en-têtes http avec chaque demande. si l'utilisateur se connecte avec l'authentification basique, il/elle aura de fermer son navigateur de la fenêtre de déconnexion.
J'ai trouvé une très intéressante façon de surmonter ce problème en utilisant une variable de session, de se souvenir que l'utilisateur s'est déconnecté. L'idée est que, même si le navigateur est encore l'envoi de données d'authentification, nous sommes juste de l'ignorer, parce que l'utilisateur a choisi de se déconnecter. Chaque fois qu'une nouvelle demande de connexion est envoyé au navigateur, toutes les données d'authentification est effacé, de sorte que l'utilisateur est en mesure de se connecter à n'importe quel moment.
Puis, sur les événements de contrôleur-je faire:
Et enfin ma session contrôleur ressemble à ceci:
Et n'oubliez pas vos itinéraires!
Cela ne fonctionne que pour IE 6 SP1+:
http://msdn.microsoft.com/en-us/library/ms536979(SV.85).aspx
Remarque que cela va effacer le cache pour tous les sites, l'utilisateur est actuellement connecté (au sein de l'IE exemple).
Hmm, il semble que le navigateur du client est juste une mise en cache HTTP Basic Auth informations d'identification et de re-envoyer à chaque fois. Dans ce cas, vous n'avez aucun contrôle sur. Les actions que vous souhaitez être protégé doivent être protégés avec le bon before_filter pour la restful_authentication plugin, qui devrait être
Dans votre contrôleur, vous auriez
L'Authentification HTTP est sans état - qui est, le serveur ne garde pas la trace d'un authentifié "session" - ainsi, le client doit fournir à chaque fois (d'où le fréquent case "stocker ces informations d'identification'), donc il n'y a aucun moyen pour le serveur pour effacer les informations d'identification du client. Cela fait partie de la spécification. Voir l'article de Wikipédia
http://en.wikipedia.org/wiki/Basic_access_authentication
Spécifiquement, regardez les "Inconvénients" de la section.
Je viens de mettre à jour login_from_basic_auth dans authenticated_sytem à lire:
Un moyen de résoudre ce problème est de désactiver le "authentification http de base" complètement
Mais nous avions besoin de cela pour une bonne expérience utilisateur au cours de l'Ajax actions, de sorte que nous avons permis à cette authentification uniquement pour les actions ajax
Je sais que, peu après la partie, mais Si vous voulez vous déconnecter, vous pouvez rendre 401.
sorte de déconnexion méthode pourrait ressemble à ceci:
votre réparateur action pourrait ressemble à ceci:
et le navigateur va augmenter l'authentification http de base de nouveau