Rails使用Devise lockable模块如何配置多档位unlock_in解锁时长
Rails Devise lockable模块实现阶梯式账户锁定时长配置方案
Devise 默认的lockable模块配置为全局静态值,要实现不同锁定次数对应不同解锁时长,按以下步骤操作即可:
- 第一步:给身份表(以User为例)新增历史锁定次数字段
生成迁移文件:
执行迁移:rails generate migration AddFailedLockCountToUsers failed_lock_count:integer default:0rails db:migrate - 第二步:在身份模型中重写lockable核心方法,实现动态时长计算
以User模型为例,代码如下:class User < ApplicationRecord # 原有devise配置保留:lockable即可 devise :database_authenticatable, :registerable, :recoverable, :rememberable, :validatable, :lockable # 重写解锁时长逻辑,可自定义阶梯规则 def unlock_in case failed_lock_count when 0 # 首次锁定用原配置的1小时 1.hour when 1 # 第二次锁定调整为24小时 24.hours else # 第三次及以上锁定调整为7天,可按需修改 7.days end end # 重写锁定触发方法,累计历史锁定次数 def lock_access!(opts = {}) super(opts) increment!(:failed_lock_count) if access_locked? end # 【可选配置】如果需要用户解锁后重置锁定次数,重写解锁方法即可 # 不需要累计历史锁定次数就保留以下代码,需要永久累计就删除 def unlock_access! super update!(failed_lock_count: 0) end end - 原有
config/initializers/devise.rb中的lockable配置无需修改,全局的maximum_attempts、lock_strategy等配置仍会生效,unlock_in全局配置会被模型层的重写方法覆盖,不影响功能。
内容的提问来源于stack exchange,提问作者stanbj
相关产品推荐
相关产品推荐

