Безопасно ли указывать ссылку на текущего пользователя в модели User в Rails? - PullRequest
1 голос
/ 26 марта 2010

Вы знаете, я думаю, что я должен проверить текущего пользователя в обратных вызовах модели (например, before_update). Вместо того, чтобы полагаться исключительно на добавление where ('something.user_id = ?', 'current_user.id') в контроллеры. Мне нужно что-то вроде Thread.CurrentPrincipal в .NET
Безопасно ли указывать ссылку на текущего пользователя в пользовательской модели? Извините, я не совсем понимаю, как это работает под капотом.
Или как ты это делаешь в Rails?
Извините, если это глупый вопрос.

Добавлено 3/27
К сожалению
Чтобы получить правильный ответ, вы должны задать правильный вопрос. И это не простая задача сама по себе. Как может быть, что вопросы других людей настолько неясны, и они получают свои ответы, а ваш собственный вопрос настолько ясен, но никто не понимает этого? :)
Я не понимаю, где поставить проверку безопасности. Именно пользователь получит доступ только к своим вещам. На уровне контроллера? А потом проверить каждое действие? "не должен / просмотр | создавать | редактировать | уничтожать / другие вещи пользователя"? Я подумал, может быть, я могу поместить его в модель и иметь одно место для / записи | рефактора | теста /. Вот почему я спросил о том, как я могу получить ссылку на текущего пользователя.
На самом деле я удивлен, что не нашел ничего релевантного в Rails Guides или Blogs. Было задано несколько вопросов, но никаких авторитетных «лучших практик», кроме «не делай этого».
Подумав немного, я решил просто создать в контроллере before_filter область видимости, доступную текущему пользователю, и просто положиться на свое собственное соглашение (пообещал себе, что не буду напрямую обращаться к модели). И просто протестируйте его один раз для каждого контроллера. В любом случае, это не банковское приложение.

Ответы [ 2 ]

1 голос
/ 26 марта 2010

Я не уверен, что понял вашу ситуацию. Если вы хотите проверить, принадлежит ли экземпляр какой-либо другой модели текущему пользователю - используйте ассоциации (я понял это из "thing.user_id =? ").

Иначе - в ActiveRecord before_update метод используется для каждого отдельного экземпляра. То есть Вы передаете текущий экземпляр этому обратному вызову в качестве аргумента. Следовательно:

def before_update(current_user_instance)
  current_user_instance.do_something
end

Будет выдавать любой пользовательский экземпляр как current_user_instance в обратном вызове. Таким образом, вы можете сделать следующее:

>> user_1 = User.find(1)
>> user_1.update_attribute(:some_attribute, 'some value')
>> user_2 = User.find(2)
>> user_2.update_attribute(:some_attribute, 'some other value')

Это вызовет метод do_something в отдельных экземплярах (user_1 и user_2)

0 голосов
/ 26 марта 2010

Я не совсем понимаю Thread.CurrentPrincipal, но current_user обычно означает зарегистрированного пользователя, и это полностью контекст контроллера. Он не доступен для использования внутри модели. Таким образом, хакерское решение было бы:

class UseCase < ActiveRecord::Base
  after_save :my_callback_method

  attr_accessor :current_user

  def my_callback_method
    # Some operations based on current_user
  end

  # ...
end

А потом в вашем контроллере:

#...
use_case = UseCase.find(use_case_id) # Just an example, can be anything
use_case.current_user = current_user
# then this
use_case.save
# or basically
use_case.method_that_triggers_after_save_callback
#...

Предупреждение: я уверен, что это плохая практика (я никогда не использовал ее сам). Но это будет работать. Руби-гуру / MVC-гуру, пожалуйста, прокомментируйте.

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