2009-05-21 6 views
0

J'ai été cogner la tête contre celui-ci pour quelques jours maintenant:RoR: AuthenticatedSystem pas correctement redirigeront sur Safari

J'ai une application utilisant RoR AuthenticatedSystem pour exiger l'authentification pour certaines des ressources. Un before_filter vérifie si l'utilisateur s'est connecté. Sinon, il saisit request.request_uri et le place dans une variable de session (session [: return_to]), puis envoie l'utilisateur à la page de connexion via un message de redirection 302. Ensuite, après la connexion, l'utilisateur est redirigé vers l'URL de session [: return_to].

Cela fonctionne très bien dans IE et Firefox. Dans Safari, request.request_uri sur le before_filter initial est vide et le contrôleur de session redirige toujours vers la page principale.

Est-ce que quelqu'un a déjà rencontré ça? Le seul indice que j'ai est que l'inspecteur Web pour Safari ne montre même pas la demande pour la page initiale, seulement la demande pour la connexion. Dans Firefox, je vois les deux demandes.

Voici le before_filter:

def login_required 
    if !authorized? 
    session[:return_to] = request.request_uri 
    redirect_to new_session_path 
    end 
end 

Voici la session/créer:

def create 
    self.current_user = User.authenticate(params[:login], params[:password]) 
    if logged_in? 
    if params[:remember_me] == "1" 
     current_user.remember_me unless current_user.remember_token? 
     cookies[:auth_token] = { :value => self.current_user.remember_token , :expires => self.current_user.remember_token_expires_at } 
    end 
    redirect_back_or_default('/') 
    flash[:notice] = "Logged in successfully" 
    else 
    flash.now[:error] = "Authentication failed." 
    render :action => 'new' 
    end 
end 

Toutes les idées?

Répondre

0

Donc, juste au cas où quelqu'un traverse cette ...

La réponse semble être dans le blocage agressif de Safari de cookies 3ème partie. Cette erreur se produisait dans un bookmarklet, qui est fondamentalement un iframe ajouté au DOM d'un site tiers lorsque l'utilisateur décide de l'utiliser (ne vous inquiétez pas, c'est quelque chose de similaire au bookmarklet de FriendFeed - essentiellement un moyen pour les utilisateurs d'ajouter du contenu d'autres sites sans quitter ces sites). Quoi qu'il en soit, dans ce cas, Safari traite le cookie de session que Rails essaie de définir comme étant un tiers, même s'il est défini depuis l'intérieur d'un iframe. Ainsi, lors de la redirection, toutes les variables de session sont perdues.

Deux solutions possibles se présentent

  • disent les utilisateurs accepter les cookies tiers (pas heureux avec cette option)
  • passe l'url « de return_to » ainsi que les données de formulaire et de récupérer ce dans la session contrôleur (meilleure option)
Questions connexes