【问题标题】:Customize Devise SessionsController create action自定义设计 SessionsController 创建动作
【发布时间】:2019-05-20 02:39:57
【问题描述】:

我想添加一项功能,该功能将使用过期密码的用户重定向到重置密码页面。 我的控制器是这样的

class Users::SessionsController < Devise::SessionsController

  def create
    user = User.find_by(email: params[:user][:email].downcase)
    if user.password_expire?
      raw, enc = Devise.token_generator.generate(current_user.class,
                                               :reset_password_token)
      user.reset_password_token   = enc
      user.reset_password_sent_at = Time.now.utc
      user.save(validate: false)
      redirect_to edit_password_url(user, reset_password_token: raw)
    else
      self.resource = warden.authenticate!(auth_options)
      set_flash_message(:notice, :signed_in)
      sign_in(resource_name, resource)
      yield resource if block_given?
      respond_with resource, location: after_sign_in_path_for(resource)
    end
  end

end

当我在操作顶部使用 binding.pry 进行调试时,我发现 current_user 存在并且 user_signed_in?是真的。我怎么可能在 create 方法完成之前登录?

【问题讨论】:

    标签: ruby-on-rails devise passwords


    【解决方案1】:

    如果您使用的是安全扩展,则根本不需要处理密码过期的实施。 如果你不使用它,你应该检查一下 - devise_security_extension。

    【讨论】:

      【解决方案2】:

      Devise 会记住当前用户使用 cookie,直到他们注销为止。

      仅仅因为他们点击了您的登录路线并不意味着他们已经退出。

      深入设计

      跟踪 Devise 中的代码以了解我们看到的情况:

      1. Devise::SessionsController#create

      class Devise::SessionsController < ApplicationController
        # ...
        def create
          # ...
          sign_in(resource_name, resource)
          # ...
        end
      end
      

      2。 Devise::Controllers::Helpers#sign_in

        def sign_in(resource_or_scope, *args)
          # ...
          if options[:bypass]
            warden.session_serializer.store(resource, scope)
          elsif warden.user(scope) == resource && !options.delete(:force)
            # Do nothing. User already signed in and we are not forcing it.
            true # <=== Here's the moment of truth
          else
          # ...
        end
      

      结论

      • 用户可以在已经登录后点击您的sessions#create
      • 在这种情况下,默认的设计行为是什么都不做
      • 不太确定您想要在上面实现什么,但调用 super 可能会派上用场,以恢复默认的设计行为

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-12-30
        • 2014-10-12
        • 1970-01-01
        • 2010-11-17
        • 1970-01-01
        • 1970-01-01
        • 2019-06-22
        • 1970-01-01
        相关资源
        最近更新 更多