9
votes

Rediriger la boucle avec Devise After_Sign_in_Path_for

Je suis un peu un problème noob. Je voulais obtenir du congé à rediriger vers la dernière page de l'utilisateur visité. Donc, j'ai fait ce qui suit ... xxx

fonctionne génial ... sauf si l'utilisateur se connecte réellement via le formulaire d'origine qui provoque une boucle de redirection.

J'ai essayé xxx

mais cela ne fonctionne pas, probablement parce que je n'ai aucune idée de quelle demande.Referer revient réellement lorsqu'il rencontre la connexion de l'utilisateur d'origine. page (www.example.com/users/sign_in).

p>> Idées?

TLDR; Utilisation du congé, je veux rediriger vers la page connectée à partir de (c.-à-d. / Blog / 4) sauf si la page est / user / utilisateurs / signe_in

résolu:

Matchu avait raison. La requête.referer renvoyait le domaine aussi ... xxx

(Remarque: pas de préfixe www)

Je suis toujours intéressé par une alternative Demander.referer si c'est une manière non sécurisée ou inefficace.


2 commentaires

Le référateur contient probablement le nom de domaine: /


Cela fonctionne assez bien pour moi: Stackoverflow.com/questions/5255283/...


4 Réponses :


12
votes

Ne pas rediriger vers les référenciers - c'est généralement une mauvaise idée.

à la place, passez un suivant de la valeur de la chaîne de requête ou du formulaire. Peut-être utiliser quelque chose comme: xxx

Lorsqu'un utilisateur tente de visiter une page nécessitant une authentification (par exemple, / admin / message / 3 / modifier / modifier ) le authentification avant_filter Problème A redirect_to new_session_url (: suivant => demande.path) . Puis cochez l'action de connexion et affiché pour préserver le paramètre : suivant de la chaîne de requête.


2 commentaires

Pas sûr de ce que vous voulez dire. Comme une entrée cachée: ensuite contenant l'URL actuelle?


Je vais marquer la justice comme la réponse acceptée à moins que l'une ou l'autre Matchu puisse republier comme une réponse ou une justice peut expliquer davantage une alternative à la demande. Riferer



2
votes

Que diriez-vous:

def after_sign_in_path_for(resource)
  sign_in_url = url_for(:action => 'sign_in', :controller => 'users', :only_path => false, :protocol => 'http')  
  if (request.referer == sign_in_url)
    super
  else
    request.referer
  end
end


1 commentaires

Cela a fonctionné pour moi. Je devais changer la deuxième ligne en "signe_in_url = url_for (: action =>" nouveau ",: contrôleur =>" sessions ',: seulement_path => false,: protocole => "http')"



2
votes

J'ai pris la réponse de la justice et j'ai changé pour utiliser des sessions à la place.

Autant que je puisse le constater, les sessions sont plus simples, puis ajoutent l'URL comme param, mais ils pourraient se comporter inattendu lorsqu'un utilisateur navigue dans plusieurs onglets. , par exemple. L'utilisation de sessions est moins reposante, mais plus simple et plus propre. P>

Lorsque vous utilisez CANCAN, le réglage de la trajectoire de redirection peut être effectué dans un endroit central: l'endroit qui gère les exceptions "Access refusé": P> xxx pré>

mais vous pouvez définir ceci n'importe où, réellement: p> xxx pré>

puis, dans applicationController code>, vous pouvez re -Utilisez cette valeur de session. Assurez-vous de le retirer aussi, cependant. P>

  def after_sign_in_path_for(resource)
    path = ''
    if session[:next]
      path = session[:next]
      session[:next] = nil
    else
      path = super
    end

    path
  end


0 commentaires

0
votes

Voici mon code à Rescue_from CODE> CANCAN.

rescue_from CanCan::AccessDenied do |exception|
  if current_user.nil?
    session[:next] = request.fullpath
    puts session[:next]
    redirect_to login_url, :alert => "You have  to be logged in to continue"
  else
    #render :file => "#{Rails.root}/public/403.html", :status => 403
    if request.env["HTTP_REFERER"].present?
      redirect_to :back, :alert => exception.message
    else
      redirect_to root_url, :alert => exception.message
    end
  end
end


0 commentaires