Каковы проблемы безопасности использования User.current_user - PullRequest
2 голосов
/ 11 октября 2010

Этот пост - http://www.ruby -forum.com / topic / 51782 - кажется, предлагает способ установки User.current_user в before_filter в контроллере и доступа к User.current_user в моделях, затронутых этим действие. Это совершенно потокобезопасно или здесь есть проблемы с безопасностью? Похоже, что правильным подходом было бы всегда передавать @current_user в любую модель, которая в этом нуждается, но это становится грязным.

Ответы [ 2 ]

5 голосов
/ 11 октября 2010

Это решение не является поточно-ориентированным, и при обработке двух запросов (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
2 голосов
/ 11 октября 2010

Использование глобального before_filter в вашем ApplicationController должно быть поточно-ориентированным (если вы используете потоковое локальное хранилище).Это из превосходной документации драгоценного камня Declarative_authorization :

Если вы хотите использовать защиту модели, добавьте before_filter, который глобально устанавливает пользователя в ApplicationController.Это поточно-ориентированное.

before_filter :set_current_user 
protected  def set_current_user   
  Authorization.current_user = current_user
end

Обновление:

Фактическая реализация Authorization.current_user выглядит как this .Он использует локальное хранилище потоков, что делает его потокобезопасным.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...