【问题标题】:Rails: Persist params through an Unauthorized request?Rails:通过未经授权的请求保留参数?
【发布时间】:2015-09-04 23:59:11
【问题描述】:

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

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

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

  • 跳过验证密码编辑页面(看起来很糟糕,但我仍然没有看到如何执行此操作)
  • 创建一系列过滤器来检查请求然后重定向回来 到edit_password_url ...但是我如何保留该重置密码 令牌?
  • 或者,我可以以某种方式强制退出用户 应用程序在该用户通过 API 登录失败的过程中的某处。但是这些是命名空间并在不同的控制器下,我还没有找到一种方法来强制注销。

【问题讨论】:

    标签: ruby-on-rails authentication devise params


    【解决方案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'}
    

    【讨论】:

    • 这太接近了,如果我不使用 spree_auth_devise,我认为它会起作用。你熟悉吗?我想将我的密码控制器编辑为您显示的类似内容,但文件开头如下:Spree::UserPasswordsController.class_eval do 而不是UserPasswordsController &lt; Devise::PasswordsController。我输入了before_filter :require_no_authentication, :only =&gt; :edit,但它仍在进行身份验证和重定向。有什么想法吗?
    • 你可以扩展Spree::UserPasswordsController,但是你需要使用skip_before_filterbefore_filter(或更好的before_action)不会覆盖之前的声明...你试过了吗?
    • 我明白了。 “跳过”部分似乎不直观。那么:skip_before_filter :require_no_authentication, only: [:edit] 实际上会跳过身份验证吗?
    • 这是过滤器的工作方式。稍后的声明不会覆盖,它只是添加过滤器。您可以使用 :skip 删除(或绕过)它们。
    • 我确定它应该可以工作。但这就像在 before_filter 之前发生了一些授权。我到处都有 binding.prys,没有一个可以捕获,我只看到 401 Unauthorized。目前还不确定。
    猜你喜欢
    • 2017-11-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-17
    • 1970-01-01
    • 2012-12-04
    • 2021-05-12
    • 2021-12-29
    相关资源
    最近更新 更多