【问题标题】:How to extend Devise SessionsController#create when using allow_unconfirmed_access?使用allow_unconfirmed_access时如何扩展Devise SessionsController#create?
【发布时间】:2016-04-08 18:30:56
【问题描述】:

在我的 Rails 项目中,我使用的是 Devise,并且我在设计初始化程序中打开了 allow_unconfirmed_access,如下所示:

config.allow_unconfirmed_access_for = 1.day

这很好用。如果用户没有通过确认电子邮件确认他们的帐户,他们仍然可以登录 24 小时。在此之后,如果他们尝试登录,Devise 会对其进行处理并给出一条闪烁消息并返回 401,从而不允许登录。

我希望能够参与其中并添加一个自动重新发送确认电子邮件的步骤,但我一生都无法弄清楚在哪里做。

【问题讨论】:

    标签: ruby-on-rails devise


    【解决方案1】:

    您可以扩展 Devise::SessionsController 以添加此行为:

    class Users::SessionsController < Devise::SessionsController
      before_action :resend_confirmation_email_if_unsent, on: :create
    
      def resend_confirmation_email
        @user = resource  # resource is a devise controller helper method
    
        unless @user.active_for_authentication?
          @user.resend_confirmation_instructions  # Resets token
    
          # Or, if you don't want to reset the tokn
          # @user.send_confirmation_instructions
        end
        # ....
      end
    

    【讨论】:

      【解决方案2】:

      我知道这是一个老问题,但我想我不妨在处理相同情况时回答它。

      Anthony E 的回答几乎是正确的,但它忽略了在创建操作开始之前未定义 resource 的事实,因此此时资源为 nil。我的解决方案是这样的:

      class Users::SessionsController < Devise::SessionsController
        before_action :resend_confirmation_email_if_needed, on: :create
      
        def resend_confirmation_email_if_needed
          @user = resource_class.find_by_email(resource_params[:email])
          unless @user.nil? || @user.active_for_authentication?
            @user.resend_confirmation_instructions
          end
        end
      end
      

      我不确定以这种方式检索用户是否是个好主意。如果super do |resource| 能做到这一点会容易得多,但它只在成功登录时运行,事实并非如此。

      希望这会有所帮助!

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-07-15
        • 1970-01-01
        • 2011-06-18
        • 1970-01-01
        • 1970-01-01
        • 2021-07-24
        相关资源
        最近更新 更多