使用User.current_user有哪些安全问题

New*_*ewy 2 ruby-on-rails

这篇文章 - http://www.ruby-forum.com/topic/51782-似乎提出了一种方法,即在控制器的before_filter中设置User.current_user,并在受该操作影响的模型中访问User.current_user.这是完全线程安全还是存在安全问题?似乎正确的方法是始终将@current_user传递给任何需要它的模型,但这会变得混乱.

Sam*_*uel 5

该解决方案不是线程安全的,当处理两个请求(A和B)时,后一个请求将更改前一个用户的中间请求(这几乎不可能调试并且对用户极其困惑).

将用户(或用户标识)存储在当前线程的存储中.

class User < ActiveRecord::Base
  class << self
    def current_user
      Thread.current[:current_user]
    end

    def current_user=(user)
      Thread.current[:current_user] = user
    end
  end
end

before_filter :set_current_user
private
  def set_current_user
    User.current_user = User.find(session[:user_id])
  end
Run Code Online (Sandbox Code Playgroud)