Где и как назначить роль пользователя: admin для attr_accessible в rails 3.1? - PullRequest
10 голосов
/ 09 декабря 2011

В руководстве по Rails в разделе http://edgeguides.rubyonrails.org/security.html,, раздел 6.1, в нем представлена ​​роль attr_accessible с: как опция,

attr_accessible :name, :is_admin, :as => :admin

Мой вопрос: если пользователь войдет в систему, где и как сможетЯ назначаю пользователя на роль администратора, чтобы он / она получил право массового назначения с помощью attr_accessible?Также я могу определить свою собственную роль, такую ​​как group_to_update?Если это так, что должно входить в определение group_to_update?

Спасибо.

Ответы [ 3 ]

32 голосов
/ 09 декабря 2011

Вы используете некоторую техническую терминологию в расплывчатой ​​форме, что делает ваше понимание этого процесса запутанным, поэтому я собираюсь сначала прояснить эту терминологию.

где и как я могу назначитьuser to: роль администратора

Роль, используемая в параметре :as для attr_accessible, не является ролью пользователя.Это атрибут роль.Это означает, что атрибут защищен от перезаписи, если только эта роль не указана в операторе, который устанавливает атрибут.Таким образом, эта система не зависит от какой-либо пользовательской системы.Вашему приложению даже не нужно, чтобы пользователи имели роли в массовом назначении.

могу ли я определить свою собственную роль, такую ​​как group_to_update

Роли на самом деле не определены"в любом формальном смысле вообще.В любом месте, где ожидается роль, просто используйте любой символ / строку (например, :group_to_update) в качестве роли.Нет необходимости указывать его где-либо еще заранее.

Вот как это работает.Обычно при массовом назначении хэша атрибутам модели все атрибуты модели используются в качестве ключей к назначенному хешу.Таким образом, если у вас есть модель Barn и ее экземпляр barn с тремя атрибутами horse, cat и rabbit, то это:

barn.attributes = params

по сути то же самое, что иделать:

barn.horse = params[:horse]
barn.cat = params[:cat]
barn.rabbit = params[:rabbit]

Теперь, если вы установите любое значение attr_accessible для модели сарая, только атрибуты, которые вы там установите, будут обновляться при использовании массового назначения.Пример:

class Barn < ActiveRecord::Base
    attr_accessible :cat
    attr_accessible :rabbit
end

Тогда это:

barn.attributes = params

Только сделает это:

barn.cat = params[:cat]
barn.rabbit = params[:rabbit]

Поскольку только «кошка» и «кролик» доступны(«Лошадь» нет).Теперь рассмотрите возможность установки роли атрибута следующим образом:

class Barn < ActiveRecord::Base
    attr_accessible :cat
    attr_accessible :rabbit, :as => :banana
end

Во-первых, обратите внимание, что роль может на все, что вы хотите , если она является символом / строкой.В этом случае я сделал роль :banana.Теперь, когда вы устанавливаете роль для атрибута attr_accessible, он обычно не назначается.Это:

barn.attributes = params

Теперь будет делать только это:

barn.cat = params[:cat]

Но вы можете назначать атрибуты , используя определенную роль , используя метод assign_attributes.Таким образом, вы можете сделать:

barn.assign_attributes(params, :as => :banana)

Это назначит все нормально защищенные параметры, а также все параметры, защищенные ролью :banana:

barn.cat = params[:cat]
barn.rabbit = params[:rabbit]

Так что рассмотрим более длинный пример сдополнительные атрибуты:

class Barn < ActiveRecord::Base
    attr_accessible :cat
    attr_accessible :rabbit, :as => :banana
    attr_accessible :horse, :as => :banana
    attr_accessible :cow, :as => :happiness
end

Затем вы можете использовать эти роли при назначении атрибутов.Это:

barn.assign_attributes(params, :as => :banana)

Соответствует:

barn.cat = params[:cat]
barn.rabbit = params[:rabbit]
barn.horse = params[:horse]

И это:

barn.assign_attributes(params, :as => :happiness)

Соответствует:

barn.cat = params[:cat]
barn.cow = params[:cow]

Теперь, Если вы выберете , вы можете сделать так, чтобы роли пользователей (например, столбец «роль» в вашей модели пользователя) соответствовали ролям атрибутов в любой модели.Таким образом, вы можете сделать что-то вроде этого:

barn.assign_attributes(params, :as => user.role)

Если эта роль user окажется banana, то (используя наш последний пример модели) она установит атрибуты на сарае для кошки, кроликаи лошадь.Но это только один из способов использования атрибутных ролей.Это зависит только от вас, если вы хотите использовать их по-другому.

3 голосов
/ 09 декабря 2011

Это необходимо для защиты от массового назначения, как объясняет ваша ссылка.

В рельсах (для обновления) это влияет только на вызов update_attributes .Вы все еще можете использовать update_attribute или admin = методы для назначения переменной администратора.

User.first.update_attributes(:name => "Gazler", :admin => true) #this will not work
User.first.update_attribute(:admin, true) #This will work

#This will also work
user = User.first
user.admin = true
user.save

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

1 голос
/ 09 декабря 2011

Посмотрите на метод assign_attributes .

Короче говоря, он позволяет присваивать атрибуты только тогда, когда вы также передаете роль.В документах есть очень хорошие и легко понятные примеры кода.В каком-то смысле это работает как своего рода фильтр или охрана.

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