我想在我的应用程序中尝试5次后锁定用户。因此,当我使用devise lockable时,它正在工作。但我想将其用于API方法(默认操作除外)。
设计:database_authenticatable,: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
发布'/ user_sign_in'=>'api / users#user_sign_in'
如果我正在使用api调用“ user_sign_in”方法。它不是更新设计可锁定方法。如何在API中触发设计方法?
答案 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