Как использовать блокируемую функциональность Devise вне контроллера или метода devise? - PullRequest
0 голосов
/ 18 февраля 2019

Я хочу заблокировать пользователя после 5 попыток в моем приложении.Так что это работает, когда я использую devise lockable.Но я хочу использовать его для метода API, кроме действия по умолчанию.

, когда я использую контроллер и модель devise, он работает

devise: 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

на маршрутах

post '/ user_sign_in' => 'api / users # user_sign_in'

если я использую API-метод вызова user_sign_in.Это не обновление разработанного блокируемого метода.Как вызвать метод разработки в API?

Ответы [ 3 ]

0 голосов
/ 19 февраля 2019
#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
0 голосов
/ 19 февраля 2019

Я добавил / 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
0 голосов
/ 18 февраля 2019

Для увеличения количества блокировок вы должны использовать user.increment_failed_attempts.Однако, чтобы увидеть, заблокирован пользователь или нет, вы должны использовать user.access_locked?.Пример кода здесь:

if user.access_locked?
  return redirect_to root_path, alert: 'Your account is locked'
end

unless user.valid_password?(params[:password])
 if Devise.maximum_attempts <= user.increment_failed_attempts
   user.lock_access!(send_instructions: true)
 end
 user.save(validate: false)  
end 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...