В моем приложении rails я использую Devise, который аутентифицирует пользователей в приложении. Это дает мне переменные, такие как current_user.id
, который является текущим пользователем UserID пользователя.В Rails, как я могу проверить, имеет ли пользователь доступ к изменению записи?
В моем приложении каждый пользователь является членом хотя бы одной группы. Любой пользователь может создать один или несколько Брелок и может назначить каждый Брелок одной из своих групп.
Итак, вот мои модели:
User has_many :memberships
User has_many :groups, :through => :memberships
Group has_many :memberships
Group has_many :users, :through => :memberships
Group has_many :trinkets
Trinket belongs_to :group
Так что мои модели! Все отлично работает!
Когда пользователь обновляет Trinket, он может назначить эту Trinket одной из своих групп.
НО, есть дефект безопасности! Если кто-то просмотрит Trinket/edit или Trinket/new page, скопирует исходный код HTML, изменит значения тегов <SELECT>
или <INPUT>
в форме, они могут фактически отправить свои Trinket в чужой GroupID.
Я хотел бы добавить валидацию в модель или контроллер, чтобы убедиться, что пользователь действительно имеет доступ к использованию представленных значений перед их записью в базу данных. В этом случае я хочу узнать, является ли GroupID для этого Trinket GroupID в пределах User.find(current_user.id).groups
, но я не могу понять, как сделать эту проверку в модели Trinket.
Кто-нибудь знает, как проверить, что пользователь пытается присвоить значение тому, что действительно имеет доступ для его назначения? Есть ли у разработчика или другого драгоценного камня способ проверки ассоциаций для представленных пользователями данных?
Текущий файл Аксессуар модель только имеет:
attr_accessible :trinketname, :group_id
validates_presence_of :trinketname
Надеется, что это имеет смысл. Помощь приветствуется! :-)
Версии: Rails 3.2.13, Ruby 1.9.3p392, Devise 2.2.4. У меня есть protect_from_forgery
в моем файле application_controller.rb.
вы можете добавить проверку в создание и обновление действия в контроллере. что-то вроде, если Tricket.group_id == current_user.group_id, тогда сделайте свое действие action else flash [: warn] «вам не разрешено» –
Спасибо, iRichLau. Это работает! Поскольку мои отношения User-Group - это многие-ко-многим, мне пришлось выполнять поиск массива вместо прямого соответствия '=='. Для 'def create':' if current_user.groups.include? (Group.find @ trinket.group_id) 'и для' def update': 'if current_user.groups.include? (Параметры Group.find [: trinket] [: group_id]).Если представленные данные включают group_id, что Пользователь не является членом, он возвращает false. Если представленная group_id не существует в базе данных, она выдает ActiveRecord :: RecordNotFound, которая была непреднамеренной, но приемлемой, поскольку это также допустимая ошибка. Ура! –