Использование: attr_accessible с авторизацией на основе ролей - PullRequest
2 голосов
/ 27 апреля 2009

В моем интернет-магазине пользователям разрешено изменять некоторые свойства своих заказов (например, свой платежный адрес), но не другие (например, IP-адрес отправителя). Администраторы, с другой стороны, могут изменять все свойства заказа.

Учитывая это, как я могу использовать :attr_accessible для правильной защиты моей модели ордера? Или мне придется использовать его, чтобы пометить доступными все атрибуты, которые администраторы могут изменять, и воздерживаться от использования Order.update_attributes(params[:order]) в тех действиях контроллера, к которым имеют доступ обычные пользователи?

Ответы [ 3 ]

4 голосов
/ 27 апреля 2009

Вообще говоря, attr_accessible - это не тот инструмент, который вы ищете, и в Rails нет ничего встроенного, что делает то, что вы хотите.

Если вы хотите детально контролировать, кто может обновлять определенные атрибуты в модели, вы можете сделать что-то вроде:

class Order < ActiveRecord::Base
  def update_attributes_as_user(values, user)
    values.each do |attribute, value|
      # Update the attribute if the user is allowed to
      @order.send("#{attribute}=", value) if user.can_modify?(attribute)
    end
    save
  end
end

Затем вы можете изменить Order.update_attributes(params[:order]) на Order.update_attributes_as_user(params[:order], current_user) и, если вы реализуете метод User#can_modify? для возврата true в правильных случаях, он должен работать.

3 голосов
/ 26 августа 2010

У меня была такая же проблема, и теперь я использую этот камень http://github.com/dmitry/attr_accessible_block

Это просто и используется на некоторых производственных сайтах.

1 голос
/ 27 апреля 2009

Да, вам придется изменить действия, поэтому разрешения проверяются внутри действий. Вызов Order#update_attributes не будет работать для обычного пользователя.

Я не могу вспомнить плагин авторизации на основе ролей, который бы разрешил то, что вы ищете. Это потому, что эти плагины смешиваются с контроллерами, а не с моделями. Они также должны были бы смешаться в ActiveRecord::Base, чтобы проверить attr_accesible и т. Д.

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