Rails Devise如何为注册与邮箱变更确认令牌设置不同过期时长
Devise 单独设置邮箱变更确认令牌有效期方案
首先明确结论:
Devise 原生不支持分别为注册确认令牌、邮箱变更确认令牌设置不同的过期时间,不存在内置的config.confirm_reconfirmable_within配置项,你没有遗漏官方公开的配置。
自定义实现方法
无需修改Devise核心源码,通过重写可确认模型的有效期判断方法即可实现需求:
- 第一步:保留
config/initializers/devise.rb中的全局配置,作为新用户注册确认的默认有效期,也可额外添加自定义配置项统一管理邮箱变更的有效期:
# 原有全局配置,作用于新用户注册确认场景 config.confirm_within = 2.weeks # 可选:新增自定义配置,统一管理邮箱变更确认的有效期 config.confirm_reconfirmable_within = 3.days
- 第二步:在你的可确认模型(通常为
app/models/user.rb)中重写confirmation_period_valid?方法,区分场景判断有效期:
class User < ApplicationRecord # 原有devise配置保留即可,注意要开启confirmable和reconfirmable模块 devise :database_authenticatable, :registerable, :recoverable, :rememberable, :validatable, :confirmable, :reconfirmable # 重写确认令牌有效期校验逻辑 def confirmation_period_valid? # unconfirmed_email有值时代表当前为邮箱变更的重确认场景 if unconfirmed_email.present? # 写法1:直接写死有效期为3天 # confirmation_sent_at >= 3.days.ago # 写法2:读取刚才新增的自定义全局配置 confirmation_sent_at >= self.class.confirm_reconfirmable_within.ago else # 注册确认场景走原生逻辑,使用全局config.confirm_within配置 super end end end
逻辑说明
用户发起邮箱变更请求后,Devise会自动将待确认的新邮箱写入unconfirmed_email字段,直到用户完成确认后才会清空该字段,因此该判断条件可以100%准确区分两类确认场景,不会和注册确认逻辑混淆,对Devise原有流程无侵入,版本升级兼容性好。
内容的提问来源于stack exchange,提问作者sellner
相关产品推荐
相关产品推荐

