Итак, я написал приложение Grails, и это прекрасно, как много работы он делает для вас.Благодаря автоматическому связыванию данных он отбрасывает множество объектов из базы данных, и все это так просто.
Но теперь, когда оно работает, я начинаю задумываться о его безопасности.Видите ли, у меня есть довольно сложная модель, которая содержит множество объектов различных типов, но только один из которых иногда необходимо сохранить.
Теоретически, кто-то может вручную создать HTML-страницу дляобмануть механизм привязки grails для обновления группы объектов в модели, которую они не имеют права обновлять.
Теперь я знаю, что grails позволяет вам указать, какие поля связаны.Но у меня действительно сложная и глубоко вложенная модель.Если бы мне пришлось везде указывать, какие поля можно связать, это было бы беспорядком.Кроме того, это разрушит приложение, потому что я ХОЧУ, чтобы эти объекты были связаны с моделью, я просто не хочу, чтобы пользователь обновлял их.Кроме того, некоторые из них являются коллекциями, и я пытаюсь понять, что может или не может быть связано в коллекции произвольного размера ... Я не вижу, чтобы это работало практически
Но что я мог сделать, впо крайней мере, теоретически, в методах контроллера, которые делают обновления, это указание на спящий режим, хорошо, это те объекты, которые я хочу, чтобы вы обновили, больше ничего, что может случиться в сеансе.
Например,Вот метод контроллера Grails для обновления пароля пользователя:
def personalUpdatePassword(AuthCommand m) {
withSecurity(m, [], {
User.withTransaction {
if (!m.personalC.validate()) {
m.personalC.personalButton = 'personalChangePasswordButton'
render(view: 'home', model: [m: m])
return
}
m.personalC.self.setRawPassword(m.personalC.rawPassword)
render(view: 'home', model: [m: m])
}
})
}
Итак, AuthCommand - действительно сложная модель, которая связывает тонну вещей.Функция withSecurity гарантирует, что у них есть разрешение на обновление пароля для этого объекта.Но поскольку привязка данных Grails настолько мощна, теоретически она могла бы обновить кучу вещей в этой модели, которые они не имеют права обновлять.И поскольку эти объекты находятся сейчас в сеансе, когда транзакция заканчивается, эти мошеннические обновления также будут обновлены.
Что я хочу сделать, это просто сказать hibernate, хорошо, я только хочу сохранить измененияк объекту m.personalC.self.Что-нибудь еще в сеансе, игнорируйте.
Есть ли способ сделать это?