如何扩展Devise Recoverable模块实现用户名重置功能
关于Devise实现用户名重置功能的解答
完全可以基于Devise的现有扩展机制实现用户名重置功能,无需从零开发,只需要参考Devise自带Recoverable模块的密码重置逻辑,自定义对应功能模块即可,具体操作步骤如下:
具体实现步骤
- 第一步:新增用户表必要字段
生成数据库迁移文件,给用户表新增和密码重置逻辑一致的用户名字段:reset_username_token(存储重置校验令牌)、reset_username_sent_at(存储令牌发送时间,用于校验过期),并给reset_username_token加唯一索引,迁移代码示例:add_column :users, :reset_username_token, :string add_column :users, :reset_username_sent_at, :datetime add_index :users, :reset_username_token, unique: true - 第二步:自定义用户名重置模块
参考DeviseRecoverable模块的源码结构,自定义UsernameRecoverable模块,放在app/models/concerns目录下即可,模块内实现三个核心逻辑:生成唯一重置令牌、发送重置通知邮件、校验令牌有效性。令牌生成可以直接复用Devise自带的Devise.friendly_token方法保证安全性。 - 第三步:扩展Devise路由
在config/routes.rb中用devise_scope声明用户名重置对应的路由,示例:devise_scope :user do post 'users/reset_username', to: 'usernames#create' put 'users/reset_username', to: 'usernames#update' end - 第四步:实现对应控制器
新建UsernamesController继承Devise的基础控制器,参考Devise::PasswordsController的逻辑实现两个动作:create:接收用户提交的邮箱,校验用户存在后生成重置令牌、发送带令牌的重置邮件update:接收令牌和新用户名,校验令牌有效性、过期时间,校验通过后更新用户名,清空对应重置字段
- 第五步:新增视图和邮件模板
参考密码重置的对应模板,新增三个模板:申请用户名重置的邮箱填写表单、带重置链接的通知邮件、提交新用户名的重置表单 - 第六步:启用自定义模块
在config/initializers/devise.rb中注册你写的UsernameRecoverable模块,之后在User模型的devise配置项中添加:username_recoverable即可启用该功能。
注意事项
- 令牌过期规则可以直接复用Devise密码重置的配置,默认1小时有效即可
- 新用户名的校验规则要和用户注册时的校验规则完全一致,避免出现非法数据
- 用户名重置成功后建议额外给用户发送操作成功通知,降低账号被盗风险
内容的提问来源于stack exchange,提问作者Ben Bagley
相关产品推荐
相关产品推荐

