2009-04-26 5 views
2

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

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

ответ

4

В общем, 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

В Rails 3.1 добавлена ​​опция: as =>: role, где вы можете назначать атрибуты. Итак, теперь это было построено. Http://api.rubyonrails.org/files/activemodel/lib/active_model/mass_assignment_security_rb.html –

1

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

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

3

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

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

+0

Спасибо! Это лучшее решение. – jrhicks

Смежные вопросы