如何在设备控制器或方法之外使用设备锁定功能?

时间:2019-02-18 12:54:54

标签: ruby-on-rails ruby

我想在我的应用程序中尝试5次后锁定用户。因此,当我使用devise lockable时,它正在工作。但我想将其用于API方法(默认操作除外)。

当我使用设计控制器和模型时,它正在工作

设计:database_authenticatable,:registerable,:lockable

控制器中的user_sign_in方法#使用自己的方法在控制器中不起作用

  if user.first.valid_password?(params[:password])
    user.update_attributes(current_sign_in_at: DateTime.current)

    success_response(:ok, user, message: 'success message')
  else

    error_response(412, nil, 'failure message')
  end

在航线上

发布'/ user_sign_in'=>'api / users#user_sign_in'

如果我正在使用api调用“ user_sign_in”方法。它不是更新设计可锁定方法。如何在API中触发设计方法?

3 个答案:

答案 0 :(得分:1)

要增加锁计数,可以使用var slides = document.getElementsByClassName("trustpilot_slides"); for (var k=slides.length-1; k>=14; k--) { var this_slide = slides[k]; this_slide.parentNode.removeChild(this_slide); } 。但是,要查看用户是否被锁定,可以使用user.increment_failed_attempts。 示例代码在这里:

user.access_locked?

答案 1 :(得分:1)

#You Can Try this way. It will work Perfectly

if user.failed_attempts >= Devise.maximum_attempts
            user.lock_access!(send_instructions: true)
    else
            user.increment_failed_attempts
end

答案 2 :(得分:1)

我在应用程序中添加了 /lib/devise/models/lockable.rb 文件。我根据我的可锁定功能使用了以下方法。一切正常。

def lock_access!(opts = { })
    self.locked_at = Time.now.utc
    if unlock_strategy_enabled?(:email) && opts.fetch(:send_instructions, true)
      send_unlock_instructions
    else
      save(validate: false)
    end
  end


 def send_unlock_instructions
    raw, enc = Devise.token_generator.generate(self.class, :unlock_token)
    self.unlock_token = enc
    save(validate: false)
    send_devise_notification(:unlock_instructions, raw, {})
    raw
  end

  def access_locked?
    !!locked_at && !lock_expired?
  end

  def increment_failed_attempts
    self.class.increment_counter(:failed_attempts, id)
    reload
  end

   def unlock_access_by_token(unlock_token)
      original_token = unlock_token
      unlock_token   = Devise.token_generator.digest(self, :unlock_token, unlock_token)

      lockable = find_or_initialize_with_error_by(:unlock_token, unlock_token)
      lockable.unlock_access! if lockable.persisted?
      lockable.unlock_token = original_token
      lockable
    end