在登录期间设计保留原始路径

时间:2014-09-02 16:25:49

标签: ruby-on-rails ruby-on-rails-3 authentication devise warden

我有一个案例,浏览器向rails应用程序(rails 3.2,设计2.2.0)发出两个请求(iframe),两者都启动登录(通过SSO),然后呈现请求的页面。问题是session[:user_return_to]存在争用条件,并且两个页面都呈现相同的页面,因此其中一个iframe最终会呈现错误的页面。

这是应用程序的流程

  1. authenticate_user!方法被调用并设计重定向到/users/sign_in页面
  2. SessionsController#new处理请求,而不是将其重定向到/sso/new
  3. 请求从SSO返回到/sso/create,用户签署(设计)并重定向到请求的页面
  4. 在第2步中,我可以将一个URL作为参数传递给/sso/new,并且该参数将在步骤3中返回给我。问题是当我在{{{{}}时,推荐人已经丢失了1}}。我所拥有的只有SessionsController#new,其中一个iframe已经有错误的值(会话被共享并且出现竞争条件)。

    我想知道推荐人是否可以通过监狱长失败以某种方式传递。在过滤器执行session[:user_return_to]之前,我无法查看是否有钩子将其作为param或header传递给warden。在该请求期间,我有推荐人,但是当重定向到authenticate_user!时,监狱长不保留它。

1 个答案:

答案 0 :(得分:1)

我能够通过使用自定义故障应用程序来解决此问题。

我在redirect_url中使用request.original_fullpath并且它有效。

这是我的失败类

class CustomDeviseFailure < Devise::FailureApp
  def redirect_url
    if sso_enabled?
      sso_path(return_to: request.original_fullpath)
    else
      super
    end
  end

  def sso_enabled?
    true
  end
end