使用Ruby Thread在多用户Rails应用程序中保存用户令牌

时间:2016-03-18 20:29:49

标签: ruby-on-rails ruby multithreading

在我们的multi_user Rails 4.2应用程序中,需要在用户登录时保存用户令牌。这是我想到的一个解决方案,在User模型中使用ruby线程添加两个方法:

class User < ActiveRecord::Base
  def self.current_token=(token)
     Thread.current[:current_token] = token
  end

  def self.current_token
     Thread.current[:current_token]
  end
end

当用户登录时,他/她的令牌由@user.current_token = token分配(假设已生成令牌)。在应用的后期,可以current_token

检索User.current_token

我是ruby线程的新手,有几件事需要确认:

1. is token above thread safe and will never be changed (by another user, or overwritten by another user's token) during the `@user`'s session lifetime?
2. is `User.current_token` available everywhere inside the Rails app (as long as `User` is accessible)?

1 个答案:

答案 0 :(得分:1)

  1. 虽然线程本地写入是线程安全的,但我不会指望它永远不会被更改。请求完成后,某些服务器将清除线程本地。请参阅:https://github.com/puma/puma/blob/61294479b2f77a838f0d91064ca6d4ed5ba4b9ff/lib/puma/thread_pool.rb#L48
  2. User.current_token将在应用中随处可见用户加载。
  3. 我不建议使用这种方法来存储令牌。我鼓励你明确地将令牌传递给任何需要它的人。这使代码:

    1. 更容易测试(您不必在User类上存根本地线程)
    2. 代码更容易推理。您确切知道令牌的来源。
    3. 不太容易出现意外的奇怪线程错误