所以,首先,如果你想从一个设计模块覆盖一个函数,你可以在你的模型文件上用相同的名字写它,可能在models/user.rb中。要从可恢复模块覆盖 set_reset_password,您只需执行以下操作(如Sergio Tulentsev 建议的那样):
class User < ActiveRecord::Base
# Include default devise modules. Others available are:
# :timeoutable and :omniauthable
devise :database_authenticatable, :registerable,
:recoverable, :rememberable, :trackable, :validatable,
:confirmable, :lockable
...
protected
def set_reset_password_token
...
end
end
现在要更改您希望原始令牌的方式(在加密之前),在我的情况下,我希望它有 6 位数字,仅包含 AZ、az、0-9 位数字,让我们看看 devise 做了什么(链接到 github 文件):
def set_reset_password_token
raw, enc = Devise.token_generator.generate(self.class, :reset_password_token)
self.reset_password_token = enc
self.reset_password_sent_at = Time.now.utc
save(validate: false)
raw
end
Devise.token_generator.generate
(参见此处SecureRandom.urlsafe_base64(rlength).tr('lIO0', 'sxyz')
)所做的是使用(长度为 20,如此处所示)生成原始令牌并返回原始和加密令牌,除非某些用户已经分配了相同的令牌。
最后,您需要做的是使用与tr联合的SecureRandom函数重写此 set_password_token以生成任何您喜欢的令牌,并且不要忘记确保令牌是唯一的并且当前未使用。