现在,我们使用phone_number作为登录名,并使用短信代码(4位数字)作为密码。当用户想要登录时:
- user enters phone number
- we generate code
- we save code to user password field
- we send code to user via sms
- user uses this sms code to login in
我们希望能够使最后生成的3个代码(密码)对登录有效:
- we started to save generated codes in separate table
这是问题:如何将其连接到authlogic?是否有任何回调可以关闭默认密码检查,并能让我添加用于密码检查的自定义逻辑?
我找到了一个解决方案,可以帮助我调整密码验证逻辑。我的authlogic
版本3.5.6和以下实现中的方法称为validate_by_password
。我复制了它的第一部分以保存空白字段和逻辑检查。并以我需要的方式改写了无效的密码检查。
class Client::Session < Authlogic::Session::Base
...
def validate_by_password
# copy paste from gem
self.invalid_password = false
# check for blank fields
errors.add(login_field, I18n.t('error_messages.login_blank', default: 'cannot be blank')) if send(login_field).blank?
errors.add(password_field, I18n.t('error_messages.password_blank', default: 'cannot be blank')) if send("protected_#{password_field}").blank?
return if errors.count > 0
# check for unknown login
self.attempted_record = search_for_record(find_by_login_method, send(login_field))
if attempted_record.blank?
generalize_credentials_error_messages? ?
add_general_credentials_error :
errors.add(login_field, I18n.t('error_messages.login_not_found', default: 'is not valid'))
return
end
# custom check for invalid password
...
end
end