Rails中使用Doorkeeper作为OAuth授权提供方时如何更新Devise用户字段
实现步骤
第一步:确认User模型开启对应Devise模块
首先检查你的app/models/user.rb中Devise配置是否包含:trackable模块(处理登录跟踪字段),需要用到失败尝试锁定逻辑的还要加:lockable模块,没有的话补充上:
class User < ApplicationRecord # 确保包含需要的模块 devise :database_authenticatable, :registerable, :recoverable, :rememberable, :validatable, :trackable, :lockable # 补充这两个模块 end
如果你的数据库还没有对应字段,运行以下命令生成迁移并执行:
rails generate migration AddTrackableAndLockableToUsers sign_in_count:integer current_sign_in_at:datetime last_sign_in_at:datetime current_sign_in_ip:string last_sign_in_ip:string failed_attempts:integer unlock_token:string locked_at:datetime rails db:migrate
第二步:修改身份验证方法
Devise内置了对应字段的更新方法,你只需在验证流程中调用即可,注意要传入当前请求对象获取IP地址:
def authenticate(email, password, request) user = User.find_for_authentication(email: email) return nil unless user&.active_for_authentication? if user.valid_password?(password) # 自动更新所有登录跟踪字段:sign_in_count、登录时间、登录IP等 user.update_tracked_fields!(request) # 重置失败尝试次数 user.reset_failed_attempts! user else # 密码错误,累计失败尝试次数 user.increment_failed_attempts! nil end end
第三步:调整Doorkeeper配置传参
在Doorkeeper初始化配置中调用验证方法时,把当前request对象传入即可:
# config/initializers/doorkeeper.rb Doorkeeper.configure do # 其他配置项省略 resource_owner_from_credentials do authenticate(params[:email], params[:password], request) end end
内容的提问来源于stack exchange,提问作者Jamiu Adeleke
相关产品推荐
相关产品推荐

