Я хочу заблокировать пользователя после 5 многократных попыток в моем приложении. Так что это работает, когда я использую devise lockable. Но я хочу использовать его для метода API, кроме действия по умолчанию.
разработать :database_authenticable, :registerable, :lockable
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?





Чтобы увеличить количество блокировок, вы должны использовать 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
#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
Я добавил файлы /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
Спасибо за ответ. попробую этот вариант