【问题标题】:Optimise query made by Devise to find user based on remember_token优化设计查询根据remember_token查找用户
【发布时间】:2014-09-05 12:59:36
【问题描述】:

我正在使用带 Rails 3.0.20 的 Devise-1.5.4。

Devise 提供了诸如current_userauthenticate_user! 等方法,它们调用authenticate!,它本身调用serialize_from_cookie,使用remember_token 对用户进行身份验证。

另外,serialize_from_cookie 方法接收id 作为参数,因此它在主键上查询Users 表(这会自动成为优化查询)。

但是,我在 MySQL 日志中看到类似 select * from users where remember_token = 'XXXXXX' 的查询。

由于 users 表变得很大,这些查询变得越来越慢。我对此有以下疑问:

  1. 我无法调试 Devise 在哪里(在代码中)进行此类查询?
  2. 如何优化这些查询(除了添加索引)?

【问题讨论】:

  • 您的用户表有多大?你也试过bundle open devise 并在 gem 中扔调试器来玩它吗?
  • 记住用户实际上应该是一个罕见的动作。这样的查询有多慢?
  • 这仍然是您的问题吗(即在提供此答案后:stackoverflow.com/questions/25686247/…)?
  • @D-side - 为什么这是一个罕见的动作? IMO,几乎每个人都记得我。此外,查询大约需要 6-8 秒。
  • @brahmana - 是的。根据stackoverflow.com/a/25687145/2036529,我了解 Devise 使用多种策略来验证用户身份。但是,正如这个问题中提到的,还有一个id 参数可以通过优化查询根据remember_token 查找用户。仅基于remember_token 搜索用户是我找不到的(在代码中也是如此)。需要这方面的帮助。

标签: ruby-on-rails ruby ruby-on-rails-3 devise


【解决方案1】:

Devise 在设置新的remember_token 时执行查询以确保尚未设置相同的令牌。

https://github.com/heartcombo/devise/blob/master/lib/devise/models/rememberable.rb#L146

# Generate a token checking if one does not already exist in the database.
def remember_token #:nodoc:
  loop do
    token = Devise.friendly_token
    break token unless to_adapter.find_first({ remember_token: token })
  end
end

【讨论】:

    猜你喜欢
    • 2012-04-26
    • 1970-01-01
    • 2021-06-14
    • 1970-01-01
    • 2020-05-21
    • 2017-05-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多