You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.02 11:09:05