Rails:通过未经授权的请求保留params?

时间:2015-09-04 15:24:13

标签: ruby-on-rails authentication devise params

此Rails项目有一个API端,用于将数据发送到iOS版本的应用程序。它使用Devise :: Lockable在登录失败3次时锁定用户帐户。

这是一个奇怪的边缘情况,但可能不是那么罕见:情况开始于已经登录到桌面版本。如果我失败登录iOS应用程序 < / em> 3次,但然后点击我的电子邮件中的重置密码链接来自桌面版,因为我已经登录,edit_password_url的请求未经授权(因为该帐户被锁定)然后我被重定向到登录页面。

在保留params(特别是密码重置令牌)的同时,还有什么办法让它仍然可以转到edit_password_url?我在想:

  • 跳过验证密码编辑页面(看起来很糟糕,但我还没看到怎么做)
  • 创建一系列过滤器,检查请求然后重定向 到edit_password_url ...但如何保留重置密码 令牌?
  • 或者,我可以以某种方式强制主要用户退出用户 app在该用户无法通过API登录的过程中的某个地方。但是这些是命名空间并且在不同的控制器下,我还没有找到一种方法来强行退出。

1 个答案:

答案 0 :(得分:1)

如果有活动会话,那么设计中会有多个操作重定向。我从不喜欢这种行为,通常会覆盖它。如果我点击链接,那就是因为我想要执行该操作。

例如,访问登录链接时,您可能希望以其他用户身份登录,因此您可以覆盖该操作以退出是否直接点击,而不是重定向。因此,对于我的示例,您将继承Devise::SessionsController

class SessionsController < Devise::SessionsController
  skip_before_filter :require_no_authentication, only: [:new]

  def new
    if warden.authenticated?(resource_name)
      sign_out
    end
    super
  end

  private

  def sign_out
    # From Devise::SessionsController#destroy
    Devise.sign_out_all_scopes ? sign_out : sign_out(resource_name)
  end
end

并在路线中覆盖它:

devise_for :users, controllers: {sessions: 'sessions'}