2011-05-28 1 views
1

У меня вопрос о безопасности Rails. Предположим, у нас есть модель User, и она имеет множество логических значений для ролей, таких как admin, director и так далее.attr_accessible/вопрос безопасности с рельсами - какой лучший способ справиться с этим?

Администратор определенно захочет редактировать эти значения в формах, поэтому мы хотим использовать attr_accessible, чтобы администратор мог это сделать.

Конечно, другие виды использования также смогут редактировать свою модель User - либо редактировать свой профиль, либо приглашать/добавлять новых пользователей в систему самостоятельно. В случае режиссера, мы на самом деле хотим, чтобы они установить роли, которые являются «меньшим», чем режиссер, но мы не хотим, чтобы он был в состоянии установить director или admin

Поскольку мы подвергаем эти контроллеры, которые модифицируют пользователь, Wouldn 't attr_accessible разрешить в этом случае director и admin? Это звучит как очень большая дыра в безопасности.

Итак, каков наилучший способ ограничения доступа?

  1. Установить каждый параметр по одному за раз?

  2. admin = false и director = false о действиях по созданию/обновлению? Самое простое решение, но вроде неприятно иметь это в контроллере.

  3. Используйте оператор if, чтобы узнать, может ли эта роль пользователя редактировать эти атрибуты и разрешить это?

  4. Использовать рельсы callbacks ?, такие как before_validation или before_save?

  5. Некоторые другие декларативные решения?

Благодаря

ответ

3

Предстоящий выпуск Rails 3.1 (на данный момент имеется кандидат на выпуск) имеет новую опцию: attr_accessible, которая позволит вам определить роль, которая может переопределить ее на уровне контроллера, передав without_protection => true.

Вы можете прочитать об этом здесь: http://www.enlightsolutions.com/articles/whats-new-in-edge-scoped-mass-assignment-in-rails-3-1

И раздел о attr_accessible в руководстве по безопасности рельсов здесь: http://edgeguides.rubyonrails.org/security.html#countermeasures

+0

аккуратного, я должен просто обновить до 3.1, то. Я все еще довольно рано в своем проекте –