【问题标题】:Devise: Redirect to previous page after authenticating user? (request.referer results in loop)设计:验证用户身份后重定向到上一页? (request.referer 导致循环)
【发布时间】:2012-07-06 04:39:16
【问题描述】:

我正在使用 Devise 和 Omniauth 进行 facebook 身份验证。在用户使用 Devise(regular) 或 Omniauth(fb) 登录后,我试图将用户重定向到上一页。

“request.referer”在用户使用我的导航栏上的下拉登录时有效,但当用户尝试通过“http://localhost:3000/users/sign_in”url 登录时,“request.referer”给我一个无限循环错误。

这是顺序。问题在(d)中。 (a) 未登录用户点击为任务投票。 (b) 用户被重定向到“users/sign_in” url,因为“before_filter :authenticate_user!”在任务控制器中。 (c) 用户通过输入用户名/密码或单击 Facebook 图标登录。 (d) 用户应该被重定向回上一页,功能 VoteUp 完成,但出现路由错误 => 当我返回并刷新页面时,用户已登录,所以我知道这只是路由的问题

任务控制器.rb

class MissionsController < ApplicationController
 before_filter :authenticate_user!, :except => [:show, :index] 

 def vote_for_mission
   @mission = Mission.find(params[:id])
   if @mission.voted_by?(current_user) 
     redirect_to request.referer, alert: 'You already voted on this mission.'
   else
     @mission.increment!(:karma)
     @mission.active = true
     @mission.real_author.increment!(:userpoints) unless @mission.real_author.blank?

     current_user.vote_for(@mission)
     redirect_to request.referer, notice: 'Your vote was successfully recorded.'
   end
 end

ApplicationsController.rb

class ApplicationController < ActionController::Base

  protect_from_forgery                                                                                                                                    
  def after_sign_in_path_for(resource)
    sign_in_url = "http://localhost:3000/users/sign_in" || "http://onvard.com/users/sign_in" || 
    "http://www.onvard.com/users/sign_in" #url_for(:action => 'new', :controller => 'sessions', :only_path => false, :protocol => 'http')                                            
    if (request.referer == sign_in_url)                                                                                                                     
      env['omniauth.origin'] || request.env['omniauth.origin'] || stored_location_for(resource) || getting_started_path || root_path      
    else
      request.referer
    end
  end

用户被重定向到我输入的“getting_started_pa​​th”,所以我知道之前的选项不起作用。 'else' 案例,这是我使用 jquery 创建的下拉登录表单,将用户重定向到上一页非常好,但是当我尝试将 request.referer 放在 'request.referer==sign_in_url' 案例中时,它给我一个无限循环。

即使用户通过 'users/sign_in' url 登录,我如何将用户重定向到上一页??

【问题讨论】:

  • 注释 Ruby 代码:sign_in_url = "http://localhost:3000/users/sign_in" || "http://onvard.com/users/sign_in" || "http://www.onvard.com/users/sign_in" #url_for(:action =&gt; 'new', :controller =&gt; 'sessions', :only_path =&gt; false, :protocol =&gt; 'http') 将自动与sign_in_url = "http://localhost:3000/users/sign_in" 相同。

标签: ruby-on-rails ruby-on-rails-3 redirect routing devise


【解决方案1】:

您不能简单地重定向回来,因为sign_in_url 旨在仅接受未登录的用户,并且在您的应用登录后会将已登录的用户发送回该页面。

如果您需要在登录后将用户重定向到特定位置,您应该存储用户在重定向到登录页面之前尝试去的原始位置,然后在登录后检查用户是否应该去其他地方登录后,将他重定向到那里。

【讨论】:

  • 我明白了 - 所以你说重定向返回是将用户发送回登录页面。那么有没有办法可以说“返回 2 页”?如果没有,我将如何存储原始位置?
  • 您可以将其存储在会话中或 cookie 中或任何您想要的。然后,您只需检查该存储是否有东西,如果有,则重定向到它。
  • 我尝试将其存储在“session[:user_return_to] = request.referer”之类的会话中,然后尝试在其他地方调用 session[:user_return_to],但它无法访问该页面保存request.referer的时间。我认为当我在不同的操作中使用它时,它会尝试找到自己的相对 request.referer;我将如何硬保存 request.referer 的 url,以便我可以在任何地方使用该绝对 url?
【解决方案2】:

我正在向使用 devise 并且遇到相同 OP 问题的后代解决这个回复:您应该能够通过使用 #stored_location_for 来解决它,它返回用户在被重定向到之前想要到达的路径登录页面。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-03-05
    • 2013-04-07
    • 1970-01-01
    • 1970-01-01
    • 2013-05-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多