У меня есть модели пользователя, учетной записи и роли. Роль хранит тип отношений между учетной записью и пользователем.
Я оставил attr_accessible
в Role
пустым, чтобы предотвратить уязвимость массового назначения (в противном случае злоумышленники могут изменить тип роли - владелец, администратор и т. Д., Учетная запись или идентификаторы пользователей).
Но что делать, если админ хочет поменять подписчика на модератора? Это вызовет исключение безопасности массового назначения:
user = User.find(params[:id])
role = user.roles.find_by_account_id(params[:account_id])
role.type = "admin"
Как мне решить эту проблему? Один из способов - создать отдельную модель для представления каждой роли (владелец, администратор, модератор, подписчик) и использовать шаблон типа STI. Это позволяет мне делать:
user = User.find(params[:id])
user.moderatorship.build(account_id: params([:account_id])
Скучный! Мне нужно было бы создать Onwership, Moderatorship, Subscribership и т. Д. И унаследовать их от роли. Если я хочу придерживаться единой ролевой модели, как я могу иметь динамические роли, не подвергая себя уязвимости массового назначения?
Дополнительный вопрос: следует ли использовать роль пользователя has_many (у пользователя может быть одна запись для каждого типа роли) или роль has_one (у пользователя может быть только одна запись роли, которую необходимо переключить, если их роль изменится) шаблон?
class User < ActiveRecord::Base
attr_accessible :name, :email
has_many :accounts, through: roles
end
class Account < ActiveRecord::Base
attr_accessible :title
has_many :users, through: roles
end
class Role < ActiveRecord::Base
attr_accessible
belongs_to: :user
belongs_to: :account
end